summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorapatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-31 21:42:02 +0000
committerapatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-31 21:42:02 +0000
commit9d756882750dabd1abbe70b30292531abb86a34b (patch)
treecd6f3ba4d5481a39953e87570abf9a1402630772
parent8ca0b64248afd305ff938b080afdcb880a98e61b (diff)
downloadchromium_src-9d756882750dabd1abbe70b30292531abb86a34b.zip
chromium_src-9d756882750dabd1abbe70b30292531abb86a34b.tar.gz
chromium_src-9d756882750dabd1abbe70b30292531abb86a34b.tar.bz2
Support for glSetSurfaceCHROMIUM.
This command allows a previously created GPU surface to be made current for a command buffer. There are no surfaces registered at this point so this command is currently a no-op. Review URL: http://codereview.chromium.org/7077001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@87371 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/common/gpu/gpu_channel.cc10
-rw-r--r--content/common/gpu/gpu_channel.h9
-rw-r--r--content/common/gpu/gpu_command_buffer_stub.cc4
-rw-r--r--content/common/gpu/gpu_surface_stub.h10
-rw-r--r--content/gpu/gpu_info_collector.cc18
-rwxr-xr-xgpu/command_buffer/build_gles2_cmd_buffer.py7
-rw-r--r--gpu/command_buffer/client/gles2_c_lib_autogen.h4
-rw-r--r--gpu/command_buffer/client/gles2_cmd_helper_autogen.h5
-rw-r--r--gpu/command_buffer/client/gles2_demo.cc4
-rw-r--r--gpu/command_buffer/client/gles2_implementation_autogen.h4
-rw-r--r--gpu/command_buffer/common/gles2_cmd_format_autogen.h34
-rw-r--r--gpu/command_buffer/common/gles2_cmd_format_test_autogen.h13
-rw-r--r--gpu/command_buffer/common/gles2_cmd_ids_autogen.h1
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc56
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.h9
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_autogen.h7
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_mock.h4
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc41
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h9
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc3
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h6
-rw-r--r--gpu/command_buffer/service/gpu_scheduler.cc7
-rw-r--r--gpu/command_buffer/service/gpu_scheduler.h8
-rw-r--r--gpu/command_buffer/service/gpu_scheduler_linux.cc12
-rw-r--r--gpu/command_buffer/service/gpu_scheduler_mac.cc8
-rw-r--r--gpu/command_buffer/service/gpu_scheduler_win.cc12
-rw-r--r--gpu/command_buffer/service/surface_manager.cc15
-rw-r--r--gpu/command_buffer/service/surface_manager.h31
-rw-r--r--gpu/command_buffer/service/surface_manager_mock.h23
-rw-r--r--gpu/demos/framework/window.cc2
-rw-r--r--gpu/gles2_conform_support/egl/display.cc2
-rw-r--r--gpu/gpu.gyp3
-rw-r--r--ui/gfx/compositor/compositor_gl.cc16
-rw-r--r--ui/gfx/gl/gl_context.cc6
-rw-r--r--ui/gfx/gl/gl_context.h15
-rw-r--r--ui/gfx/gl/gl_context_linux.cc17
-rw-r--r--ui/gfx/gl/gl_context_mac.cc13
-rw-r--r--ui/gfx/gl/gl_context_win.cc17
-rw-r--r--ui/gfx/gl/gl_surface.h14
-rw-r--r--ui/gfx/gl/gl_surface_linux.cc32
-rw-r--r--ui/gfx/gl/gl_surface_mac.cc24
-rw-r--r--ui/gfx/gl/gl_surface_win.cc32
-rw-r--r--ui/gfx/surface/accelerated_surface_mac.cc10
-rw-r--r--ui/gfx/surface/accelerated_surface_mac.h4
-rw-r--r--webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc16
-rw-r--r--webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h6
-rw-r--r--webkit/gpu/webgraphicscontext3d_in_process_impl.cc17
-rw-r--r--webkit/gpu/webgraphicscontext3d_in_process_impl.h6
48 files changed, 450 insertions, 176 deletions
diff --git a/content/common/gpu/gpu_channel.cc b/content/common/gpu/gpu_channel.cc
index 338d426..5423544 100644
--- a/content/common/gpu/gpu_channel.cc
+++ b/content/common/gpu/gpu_channel.cc
@@ -126,6 +126,14 @@ void GpuChannel::LoseAllContexts() {
gpu_channel_manager_->LoseAllContexts();
}
+gfx::GLSurface* GpuChannel::LookupSurface(int surface_id) {
+ GpuSurfaceStub *surface_stub = surfaces_.Lookup(surface_id);
+ if (!surface_stub)
+ return NULL;
+
+ return surface_stub->surface();
+}
+
void GpuChannel::CreateViewCommandBuffer(
gfx::PluginWindowHandle window,
int32 render_view_id,
@@ -259,7 +267,7 @@ void GpuChannel::OnCreateOffscreenSurface(const gfx::Size& size,
*route_id = MSG_ROUTING_NONE;
#if defined(ENABLE_GPU)
- scoped_ptr<gfx::GLSurface> surface(
+ scoped_refptr<gfx::GLSurface> surface(
gfx::GLSurface::CreateOffscreenGLSurface(size));
if (!surface.get())
return;
diff --git a/content/common/gpu/gpu_channel.h b/content/common/gpu/gpu_channel.h
index da12ecd..0e39636 100644
--- a/content/common/gpu/gpu_channel.h
+++ b/content/common/gpu/gpu_channel.h
@@ -14,6 +14,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/process.h"
#include "build/build_config.h"
+#include "gpu/command_buffer/service/surface_manager.h"
#include "content/common/gpu/gpu_command_buffer_stub.h"
#include "content/common/gpu/gpu_surface_stub.h"
#include "content/common/message_router.h"
@@ -31,10 +32,15 @@ class MessageLoopProxy;
class WaitableEvent;
}
+namespace gfx {
+class GLSurface;
+}
+
// Encapsulates an IPC channel between the GPU process and one renderer
// process. On the renderer side there's a corresponding GpuChannelHost.
class GpuChannel : public IPC::Channel::Listener,
public IPC::Message::Sender,
+ public gpu::SurfaceManager,
public base::RefCountedThreadSafe<GpuChannel> {
public:
// Takes ownership of the renderer process handle.
@@ -86,6 +92,9 @@ class GpuChannel : public IPC::Channel::Listener,
void LoseAllContexts();
+ // Look up a GLSurface by ID. In this case the ID is the IPC routing ID.
+ gfx::GLSurface* LookupSurface(int surface_id);
+
// Get the TransportTexture by ID.
TransportTexture* GetTransportTexture(int32 route_id);
diff --git a/content/common/gpu/gpu_command_buffer_stub.cc b/content/common/gpu/gpu_command_buffer_stub.cc
index 600cab2..0593b7ec 100644
--- a/content/common/gpu/gpu_command_buffer_stub.cc
+++ b/content/common/gpu/gpu_command_buffer_stub.cc
@@ -134,7 +134,9 @@ void GpuCommandBufferStub::OnInitialize(
if (command_buffer_->Initialize(&shared_memory, size)) {
gpu::GpuScheduler* parent_processor =
parent_ ? parent_->scheduler_.get() : NULL;
- scheduler_.reset(new gpu::GpuScheduler(command_buffer_.get(), NULL));
+ scheduler_.reset(new gpu::GpuScheduler(command_buffer_.get(),
+ channel_,
+ NULL));
if (scheduler_->Initialize(
handle_,
initial_size_,
diff --git a/content/common/gpu/gpu_surface_stub.h b/content/common/gpu/gpu_surface_stub.h
index 1a9deb6..8776ee0 100644
--- a/content/common/gpu/gpu_surface_stub.h
+++ b/content/common/gpu/gpu_surface_stub.h
@@ -8,8 +8,7 @@
#if defined(ENABLE_GPU)
-#include "base/memory/scoped_ptr.h"
-#include "base/memory/weak_ptr.h"
+#include "base/memory/ref_counted.h"
#include "ipc/ipc_channel.h"
#include "ipc/ipc_message.h"
#include "ui/gfx/gl/gl_surface.h"
@@ -18,13 +17,14 @@ class GpuChannel;
class GpuSurfaceStub
: public IPC::Channel::Listener,
- public IPC::Message::Sender,
- public base::SupportsWeakPtr<GpuSurfaceStub> {
+ public IPC::Message::Sender {
public:
// Takes ownership of surface.
GpuSurfaceStub(GpuChannel* channel, int route_id, gfx::GLSurface* surface);
virtual ~GpuSurfaceStub();
+ gfx::GLSurface* surface() const { return surface_.get(); }
+
// IPC::Channel::Listener implementation:
virtual bool OnMessageReceived(const IPC::Message& message);
@@ -40,7 +40,7 @@ class GpuSurfaceStub
GpuChannel* channel_;
int route_id_;
- scoped_ptr<gfx::GLSurface> surface_;
+ scoped_refptr<gfx::GLSurface> surface_;
DISALLOW_COPY_AND_ASSIGN(GpuSurfaceStub);
};
diff --git a/content/gpu/gpu_info_collector.cc b/content/gpu/gpu_info_collector.cc
index 80c98fa..2e4630b 100644
--- a/content/gpu/gpu_info_collector.cc
+++ b/content/gpu/gpu_info_collector.cc
@@ -18,20 +18,20 @@
namespace {
-gfx::GLSurface* InitializeGLSurface() {
- scoped_ptr<gfx::GLSurface> surface(gfx::GLSurface::CreateOffscreenGLSurface(
- gfx::Size(1, 1)));
+scoped_refptr<gfx::GLSurface> InitializeGLSurface() {
+ scoped_refptr<gfx::GLSurface> surface(
+ gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1)));
if (!surface.get()) {
LOG(ERROR) << "gfx::GLContext::CreateOffscreenGLSurface failed";
return NULL;
}
- return surface.release();
+ return surface;
}
-gfx::GLContext* InitializeGLContext(gfx::GLSurface* surface) {
+scoped_refptr<gfx::GLContext> InitializeGLContext(gfx::GLSurface* surface) {
- scoped_ptr<gfx::GLContext> context(gfx::GLContext::CreateGLContext(NULL,
+ scoped_refptr<gfx::GLContext> context(gfx::GLContext::CreateGLContext(NULL,
surface));
if (!context.get()) {
LOG(ERROR) << "gfx::GLContext::CreateGLContext failed";
@@ -43,7 +43,7 @@ gfx::GLContext* InitializeGLContext(gfx::GLSurface* surface) {
return NULL;
}
- return context.release();
+ return context;
}
std::string GetGLString(unsigned int pname) {
@@ -84,11 +84,11 @@ bool CollectGraphicsInfoGL(GPUInfo* gpu_info) {
return false;
}
- scoped_ptr<gfx::GLSurface> surface(InitializeGLSurface());
+ scoped_refptr<gfx::GLSurface> surface(InitializeGLSurface());
if (!surface.get())
return false;
- scoped_ptr<gfx::GLContext> context(InitializeGLContext(surface.get()));
+ scoped_refptr<gfx::GLContext> context(InitializeGLContext(surface.get()));
if (!context.get())
return false;
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py
index cf36ade..966d861 100755
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -214,6 +214,7 @@ GL_APICALL void GL_APIENTRY glRequestExtensionCHROMIUM (const char* exte
GL_APICALL void GL_APIENTRY glSetLatchCHROMIUM (GLuint latch_id);
GL_APICALL void GL_APIENTRY glWaitLatchCHROMIUM (GLuint latch_id);
GL_APICALL void GL_APIENTRY glRateLimitOffscreenContextCHROMIUM (void);
+GL_APICALL void GL_APIENTRY glSetSurfaceCHROMIUM (GLint surface_id);
"""
# This is the list of all commmands that will be generated and their Id.
@@ -419,6 +420,7 @@ _CMD_ID_TABLE = {
'RequestExtensionCHROMIUM': 450,
'SetLatchCHROMIUM': 451,
'WaitLatchCHROMIUM': 452,
+ 'SetSurfaceCHROMIUM': 453,
}
# This is a list of enum names and their valid values. It is used to map
@@ -1490,6 +1492,11 @@ _FUNCTION_INFO = {
'decoder_func': 'DoReleaseShaderCompiler',
'unit_test': False,
},
+ 'SetSurfaceCHROMIUM': {
+ 'decoder_func': 'DoSetSurfaceCHROMIUM',
+ 'extension': True,
+ 'chromium': True,
+ },
'ShaderBinary': {'type': 'Custom'},
'ShaderSource': {
'type': 'Manual',
diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h
index 889a243..663d162 100644
--- a/gpu/command_buffer/client/gles2_c_lib_autogen.h
+++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h
@@ -889,6 +889,10 @@ void GLES2RateLimitOffscreenContextCHROMIUM() {
GPU_CLIENT_LOG("RateLimitOffscreenContextCHROMIUM" << "(" << ")");
gles2::GetGLContext()->RateLimitOffscreenContextCHROMIUM();
}
+void GLES2SetSurfaceCHROMIUM(GLint surface_id) {
+ GPU_CLIENT_LOG("SetSurfaceCHROMIUM" << "(" << surface_id << ")");
+ gles2::GetGLContext()->SetSurfaceCHROMIUM(surface_id);
+}
#endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_C_LIB_AUTOGEN_H_
diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
index e6568da..c8deb23 100644
--- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
+++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
@@ -1227,5 +1227,10 @@
c.Init(latch_id);
}
+ void SetSurfaceCHROMIUM(GLint surface_id) {
+ gles2::SetSurfaceCHROMIUM& c = GetCmdSpace<gles2::SetSurfaceCHROMIUM>();
+ c.Init(surface_id);
+ }
+
#endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_CMD_HELPER_AUTOGEN_H_
diff --git a/gpu/command_buffer/client/gles2_demo.cc b/gpu/command_buffer/client/gles2_demo.cc
index 78768dd..90825b09 100644
--- a/gpu/command_buffer/client/gles2_demo.cc
+++ b/gpu/command_buffer/client/gles2_demo.cc
@@ -56,7 +56,9 @@ bool GLES2Demo::Setup(void* hwnd, int32 size) {
if (!command_buffer->Initialize(size))
return NULL;
- GpuScheduler* gpu_scheduler = new GpuScheduler(command_buffer.get(), NULL);
+ GpuScheduler* gpu_scheduler = new GpuScheduler(command_buffer.get(),
+ NULL,
+ NULL);
if (!gpu_scheduler->Initialize(reinterpret_cast<HWND>(hwnd),
gfx::Size(),
gpu::gles2::DisallowedExtensions(),
diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h
index 97704a1..f389920 100644
--- a/gpu/command_buffer/client/gles2_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_autogen.h
@@ -899,5 +899,9 @@ void WaitLatchCHROMIUM(GLuint latch_id) {
void RateLimitOffscreenContextCHROMIUM();
+void SetSurfaceCHROMIUM(GLint surface_id) {
+ helper_->SetSurfaceCHROMIUM(surface_id);
+}
+
#endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_AUTOGEN_H_
diff --git a/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
index 0536887..67bbc36 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
@@ -8979,6 +8979,40 @@ COMPILE_ASSERT(offsetof(WaitLatchCHROMIUM, header) == 0,
COMPILE_ASSERT(offsetof(WaitLatchCHROMIUM, latch_id) == 4,
OffsetOf_WaitLatchCHROMIUM_latch_id_not_4);
+struct SetSurfaceCHROMIUM {
+ typedef SetSurfaceCHROMIUM ValueType;
+ static const CommandId kCmdId = kSetSurfaceCHROMIUM;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+
+ static uint32 ComputeSize() {
+ return static_cast<uint32>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() {
+ header.SetCmd<ValueType>();
+ }
+
+ void Init(GLint _surface_id) {
+ SetHeader();
+ surface_id = _surface_id;
+ }
+
+ void* Set(void* cmd, GLint _surface_id) {
+ static_cast<ValueType*>(cmd)->Init(_surface_id);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ int32 surface_id;
+};
+
+COMPILE_ASSERT(sizeof(SetSurfaceCHROMIUM) == 8,
+ Sizeof_SetSurfaceCHROMIUM_is_not_8);
+COMPILE_ASSERT(offsetof(SetSurfaceCHROMIUM, header) == 0,
+ OffsetOf_SetSurfaceCHROMIUM_header_not_0);
+COMPILE_ASSERT(offsetof(SetSurfaceCHROMIUM, surface_id) == 4,
+ OffsetOf_SetSurfaceCHROMIUM_surface_id_not_4);
+
#endif // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_AUTOGEN_H_
diff --git a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
index 77660e2..0f18f94 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
@@ -3534,5 +3534,18 @@ TEST(GLES2FormatTest, WaitLatchCHROMIUM) {
EXPECT_EQ(static_cast<GLuint>(11), cmd.latch_id);
}
+TEST(GLES2FormatTest, SetSurfaceCHROMIUM) {
+ SetSurfaceCHROMIUM cmd = { { 0 } };
+ void* next_cmd = cmd.Set(
+ &cmd,
+ static_cast<GLint>(11));
+ EXPECT_EQ(static_cast<uint32>(SetSurfaceCHROMIUM::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<char*>(next_cmd),
+ reinterpret_cast<char*>(&cmd) + sizeof(cmd));
+ EXPECT_EQ(static_cast<GLint>(11), cmd.surface_id);
+}
+
#endif // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_TEST_AUTOGEN_H_
diff --git a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
index 7566beb..5a3dc2d 100644
--- a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
@@ -205,6 +205,7 @@
OP(RequestExtensionCHROMIUM) /* 450 */ \
OP(SetLatchCHROMIUM) /* 451 */ \
OP(WaitLatchCHROMIUM) /* 452 */ \
+ OP(SetSurfaceCHROMIUM) /* 453 */ \
enum CommandId {
kStartPoint = cmd::kLastCommonId, // All GLES2 commands start after this.
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 25b6696..dec7c34 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -34,6 +34,7 @@
#include "gpu/command_buffer/service/renderbuffer_manager.h"
#include "gpu/command_buffer/service/shader_manager.h"
#include "gpu/command_buffer/service/shader_translator.h"
+#include "gpu/command_buffer/service/surface_manager.h"
#include "gpu/command_buffer/service/texture_manager.h"
#include "gpu/GLES2/gles2_command_buffer.h"
#include "ui/gfx/gl/gl_context.h"
@@ -661,7 +662,8 @@ bool VertexAttribManager::Enable(GLuint index, bool enable) {
class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,
public GLES2Decoder {
public:
- explicit GLES2DecoderImpl(ContextGroup* group);
+ explicit GLES2DecoderImpl(SurfaceManager* surface_manager,
+ ContextGroup* group);
// Overridden from AsyncAPIInterface.
virtual Error DoCommand(unsigned int command,
@@ -672,8 +674,8 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,
virtual const char* GetCommandName(unsigned int command_id) const;
// Overridden from GLES2Decoder.
- virtual bool Initialize(gfx::GLSurface* surface,
- gfx::GLContext* context,
+ virtual bool Initialize(const scoped_refptr<gfx::GLSurface>& surface,
+ const scoped_refptr<gfx::GLContext>& context,
const gfx::Size& size,
const DisallowedExtensions& disallowed_extensions,
const char* allowed_extensions,
@@ -1229,6 +1231,8 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,
void DoResizeCHROMIUM(GLuint width, GLuint height);
+ void DoSetSurfaceCHROMIUM(GLint surface_id);
+
// Gets the number of values that will be returned by glGetXXX. Returns
// false if pname is unknown.
bool GetNumValuesReturnedForGLGet(GLenum pname, GLsizei* num_values);
@@ -1339,9 +1343,12 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>,
#undef GLES2_CMD_OP
+ // Maps surface IDs to GLSurface.
+ gpu::SurfaceManager* surface_manager_;
+
// The GL context this decoder renders to on behalf of the client.
- scoped_ptr<gfx::GLSurface> surface_;
- scoped_ptr<gfx::GLContext> context_;
+ scoped_refptr<gfx::GLSurface> surface_;
+ scoped_refptr<gfx::GLContext> context_;
// The ContextGroup for this decoder uses to track resources.
ContextGroup::Ref group_;
@@ -1767,12 +1774,15 @@ GLenum FrameBuffer::CheckStatus() {
return glCheckFramebufferStatusEXT(GL_FRAMEBUFFER);
}
-GLES2Decoder* GLES2Decoder::Create(ContextGroup* group) {
- return new GLES2DecoderImpl(group);
+GLES2Decoder* GLES2Decoder::Create(SurfaceManager* surface_manager,
+ ContextGroup* group) {
+ return new GLES2DecoderImpl(surface_manager, group);
}
-GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group)
+GLES2DecoderImpl::GLES2DecoderImpl(SurfaceManager* surface_manager,
+ ContextGroup* group)
: GLES2Decoder(),
+ surface_manager_(surface_manager),
group_(ContextGroup::Ref(group ? group : new ContextGroup())),
error_bits_(0),
util_(0), // TODO(gman): Set to actual num compress texture formats.
@@ -1831,8 +1841,8 @@ GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group)
}
bool GLES2DecoderImpl::Initialize(
- gfx::GLSurface* surface,
- gfx::GLContext* context,
+ const scoped_refptr<gfx::GLSurface>& surface,
+ const scoped_refptr<gfx::GLContext>& context,
const gfx::Size& size,
const DisallowedExtensions& disallowed_extensions,
const char* allowed_extensions,
@@ -1842,13 +1852,15 @@ bool GLES2DecoderImpl::Initialize(
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 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.
- context_.reset(context);
+ context_ = context;
// Keep only a weak pointer to the parent so we don't unmap its client
// frame buffer after it has been destroyed.
@@ -2567,7 +2579,7 @@ void GLES2DecoderImpl::Destroy() {
if (context_.get())
context_->Destroy();
- context_.reset();
+ context_ = NULL;
offscreen_target_frame_buffer_.reset();
offscreen_target_color_texture_.reset();
@@ -2627,6 +2639,14 @@ void GLES2DecoderImpl::DoResizeCHROMIUM(GLuint width, GLuint height) {
}
}
+void GLES2DecoderImpl::DoSetSurfaceCHROMIUM(GLint surface_id) {
+ gfx::GLSurface* surface = surface_manager_->LookupSurface(surface_id);
+ if (!surface)
+ return;
+
+ surface_ = surface;
+}
+
const char* GLES2DecoderImpl::GetCommandName(unsigned int command_id) const {
if (command_id > kStartPoint && command_id < kNumCommands) {
return gles2::GetCommandName(static_cast<CommandId>(command_id));
@@ -6428,7 +6448,9 @@ error::Error GLES2DecoderImpl::HandleSetLatchCHROMIUM(
if (!latch) {
return error::kOutOfBounds;
}
- base::subtle::NoBarrier_Store(latch, 1);
+ base::subtle::Atomic32 old =
+ base::subtle::NoBarrier_CompareAndSwap(latch, 0, 1);
+ DCHECK(old == 0);
if (!latch_callback_.is_null())
latch_callback_.Run(true);
return error::kNoError;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.h b/gpu/command_buffer/service/gles2_cmd_decoder.h
index 7236cc0..699f85e 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.h
@@ -22,6 +22,8 @@ class GLSurface;
namespace gpu {
+class SurfaceManager;
+
namespace gles2 {
class ContextGroup;
@@ -40,7 +42,8 @@ class GLES2Decoder : public CommonDecoder {
typedef error::Error Error;
// Creates a decoder.
- static GLES2Decoder* Create(ContextGroup* group);
+ static GLES2Decoder* Create(SurfaceManager* surface_manager,
+ ContextGroup* group);
virtual ~GLES2Decoder();
@@ -68,8 +71,8 @@ class GLES2Decoder : public CommonDecoder {
// parent's namespace.
// Returns:
// true if successful.
- virtual bool Initialize(gfx::GLSurface* surface,
- gfx::GLContext* context,
+ virtual bool Initialize(const scoped_refptr<gfx::GLSurface>& surface,
+ const scoped_refptr<gfx::GLContext>& context,
const gfx::Size& size,
const DisallowedExtensions& disallowed_extensions,
const char* allowed_extensions,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
index 2ae8a03..9f7711a 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -2600,5 +2600,12 @@ error::Error GLES2DecoderImpl::HandleResizeCHROMIUM(
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleSetSurfaceCHROMIUM(
+ uint32 immediate_data_size, const gles2::SetSurfaceCHROMIUM& c) {
+ GLint surface_id = static_cast<GLint>(c.surface_id);
+ DoSetSurfaceCHROMIUM(surface_id);
+ return error::kNoError;
+}
+
#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_AUTOGEN_H_
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_mock.h b/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
index 425fdce..f775625 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
@@ -30,8 +30,8 @@ class MockGLES2Decoder : public GLES2Decoder {
virtual ~MockGLES2Decoder();
MOCK_METHOD8(Initialize,
- bool(gfx::GLSurface* surface,
- gfx::GLContext* context,
+ 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,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
index 298640a..274d495 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
@@ -16,6 +16,7 @@
#include "gpu/command_buffer/service/test_helper.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/gl/gl_implementation.h"
+#include "ui/gfx/gl/gl_surface_stub.h"
using ::gfx::MockGLInterface;
using ::testing::_;
@@ -2933,6 +2934,46 @@ TEST_F(GLES2DecoderTest, WaitLatch) {
EXPECT_EQ(0, latches[kLastValidLatchId]);
}
+TEST_F(GLES2DecoderTest, SetSurfaceCHROMIUMChangesSurfaceForExistentSurface) {
+ const int kSurfaceId = 1;
+ scoped_refptr<gfx::GLSurfaceStub> surface(new gfx::GLSurfaceStub);
+
+ EXPECT_CALL(*surface_manager_.get(), LookupSurface(kSurfaceId))
+ .WillOnce(Return(surface.get()))
+ .RetiresOnSaturation();
+
+ SetSurfaceCHROMIUM cmd;
+ cmd.Init(kSurfaceId);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+
+ EXPECT_EQ(surface.get(), decoder_->GetGLSurface());
+}
+
+TEST_F(GLES2DecoderTest,
+ SetSurfaceCHROMIUMDoesNotChangeSurfaceWhenSurfaceDoesNotExist) {
+ const int kExistentSurfaceId = 1;
+ const int kNonexistentSurfaceId = 2;
+ scoped_refptr<gfx::GLSurfaceStub> surface(new gfx::GLSurfaceStub);
+
+ EXPECT_CALL(*surface_manager_.get(), LookupSurface(kExistentSurfaceId))
+ .WillOnce(Return(surface.get()))
+ .RetiresOnSaturation();
+
+ EXPECT_CALL(*surface_manager_.get(), LookupSurface(kNonexistentSurfaceId))
+ .WillOnce(Return(static_cast<gfx::GLSurface*>(NULL)))
+ .RetiresOnSaturation();
+
+ SetSurfaceCHROMIUM cmd;
+ cmd.Init(kExistentSurfaceId);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+
+ cmd.Init(kNonexistentSurfaceId);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+
+ EXPECT_EQ(surface.get(), decoder_->GetGLSurface());
+}
+
+
// TODO(gman): BufferData
// TODO(gman): BufferDataImmediate
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
index 72cd0c3..f046167 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
@@ -10,5 +10,14 @@
// TODO(gman): WaitLatchCHROMIUM
+
+TEST_F(GLES2DecoderTest3, SetSurfaceCHROMIUMValidArgs) {
+ EXPECT_CALL(*gl_, SetSurfaceCHROMIUM(1));
+ SpecializedSetup<SetSurfaceCHROMIUM, 0>(true);
+ SetSurfaceCHROMIUM cmd;
+ cmd.Init(1);
+ EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
+ EXPECT_EQ(GL_NO_ERROR, GetGLError());
+}
#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_3_AUTOGEN_H_
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 a38ab8b..7dbc98c 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
@@ -55,6 +55,7 @@ void GLES2DecoderTestBase::InitDecoder(
const char* extensions, bool has_alpha_backbuffer) {
gl_.reset(new StrictMock<MockGLInterface>());
::gfx::GLInterface::SetGLInterface(gl_.get());
+ surface_manager_.reset(new StrictMock<MockSurfaceManager>);
group_ = ContextGroup::Ref(new ContextGroup());
InSequence sequence;
@@ -133,7 +134,7 @@ void GLES2DecoderTestBase::InitDecoder(
context_ = new gfx::GLContextStub;
- decoder_.reset(GLES2Decoder::Create(group_.get()));
+ decoder_.reset(GLES2Decoder::Create(surface_manager_.get(), group_.get()));
decoder_->Initialize(
surface_, context_, surface_->GetSize(), DisallowedExtensions(),
NULL, std::vector<int32>(), NULL, 0);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
index dc195c8..d939e4f8 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
@@ -16,6 +16,7 @@
#include "gpu/command_buffer/service/program_manager.h"
#include "gpu/command_buffer/service/renderbuffer_manager.h"
#include "gpu/command_buffer/service/shader_manager.h"
+#include "gpu/command_buffer/service/surface_manager_mock.h"
#include "gpu/command_buffer/service/texture_manager.h"
#include "gpu/GLES2/gles2_command_buffer.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -256,9 +257,10 @@ class GLES2DecoderTestBase : public testing::Test {
// Use StrictMock to make 100% sure we know how GL will be called.
scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
- gfx::GLSurfaceStub* surface_;
- gfx::GLContextStub* context_;
+ scoped_refptr<gfx::GLSurfaceStub> surface_;
+ scoped_refptr<gfx::GLContextStub> context_;
scoped_ptr<GLES2Decoder> decoder_;
+ scoped_ptr<MockSurfaceManager> surface_manager_;
GLuint client_buffer_id_;
GLuint client_framebuffer_id_;
diff --git a/gpu/command_buffer/service/gpu_scheduler.cc b/gpu/command_buffer/service/gpu_scheduler.cc
index 4c54773..151ff9a 100644
--- a/gpu/command_buffer/service/gpu_scheduler.cc
+++ b/gpu/command_buffer/service/gpu_scheduler.cc
@@ -19,6 +19,7 @@ using ::base::SharedMemory;
namespace gpu {
GpuScheduler::GpuScheduler(CommandBuffer* command_buffer,
+ SurfaceManager* surface_manager,
gles2::ContextGroup* group)
: command_buffer_(command_buffer),
commands_per_update_(100),
@@ -29,7 +30,7 @@ GpuScheduler::GpuScheduler(CommandBuffer* command_buffer,
#endif
method_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
DCHECK(command_buffer);
- decoder_.reset(gles2::GLES2Decoder::Create(group));
+ decoder_.reset(gles2::GLES2Decoder::Create(surface_manager, group));
decoder_->set_engine(this);
}
@@ -55,8 +56,8 @@ GpuScheduler::~GpuScheduler() {
}
bool GpuScheduler::InitializeCommon(
- gfx::GLSurface* surface,
- gfx::GLContext* context,
+ const scoped_refptr<gfx::GLSurface>& surface,
+ const scoped_refptr<gfx::GLContext>& context,
const gfx::Size& size,
const gles2::DisallowedExtensions& disallowed_extensions,
const char* allowed_extensions,
diff --git a/gpu/command_buffer/service/gpu_scheduler.h b/gpu/command_buffer/service/gpu_scheduler.h
index ebbcc88..d75beae 100644
--- a/gpu/command_buffer/service/gpu_scheduler.h
+++ b/gpu/command_buffer/service/gpu_scheduler.h
@@ -40,7 +40,9 @@ class ContextGroup;
class GpuScheduler : public CommandBufferEngine {
public:
// If a group is not passed in one will be created.
- GpuScheduler(CommandBuffer* command_buffer, gles2::ContextGroup* group);
+ GpuScheduler(CommandBuffer* command_buffer,
+ SurfaceManager* surface_manager,
+ gles2::ContextGroup* group);
// This constructor is for unit tests.
GpuScheduler(CommandBuffer* command_buffer,
@@ -139,8 +141,8 @@ class GpuScheduler : public CommandBufferEngine {
protected:
// Perform common initialization. Takes ownership of GLSurface and GLContext.
bool InitializeCommon(
- gfx::GLSurface* surface,
- gfx::GLContext* context,
+ const scoped_refptr<gfx::GLSurface>& surface,
+ const scoped_refptr<gfx::GLContext>& context,
const gfx::Size& size,
const gles2::DisallowedExtensions& disallowed_extensions,
const char* allowed_extensions,
diff --git a/gpu/command_buffer/service/gpu_scheduler_linux.cc b/gpu/command_buffer/service/gpu_scheduler_linux.cc
index 3ed89e4..f1d49da 100644
--- a/gpu/command_buffer/service/gpu_scheduler_linux.cc
+++ b/gpu/command_buffer/service/gpu_scheduler_linux.cc
@@ -31,13 +31,13 @@ bool GpuScheduler::Initialize(
}
// Create either a view or pbuffer based GLSurface.
- scoped_ptr<gfx::GLSurface> surface;
+ scoped_refptr<gfx::GLSurface> surface;
if (window) {
DCHECK(!parent_handle);
- surface.reset(gfx::GLSurface::CreateViewGLSurface(window));
+ surface = gfx::GLSurface::CreateViewGLSurface(window);
} else {
- surface.reset(gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1)));
+ surface = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1));
}
if (!surface.get()) {
@@ -47,7 +47,7 @@ bool GpuScheduler::Initialize(
}
// Create a GLContext and attach the surface.
- scoped_ptr<gfx::GLContext> context(
+ scoped_refptr<gfx::GLContext> context(
gfx::GLContext::CreateGLContext(parent_context, surface.get()));
if (!context.get()) {
LOG(ERROR) << "CreateGLContext failed.\n";
@@ -55,8 +55,8 @@ bool GpuScheduler::Initialize(
return false;
}
- return InitializeCommon(surface.release(),
- context.release(),
+ return InitializeCommon(surface,
+ context,
size,
disallowed_extensions,
allowed_extensions,
diff --git a/gpu/command_buffer/service/gpu_scheduler_mac.cc b/gpu/command_buffer/service/gpu_scheduler_mac.cc
index 1e323ec..449a90f 100644
--- a/gpu/command_buffer/service/gpu_scheduler_mac.cc
+++ b/gpu/command_buffer/service/gpu_scheduler_mac.cc
@@ -29,7 +29,7 @@ bool GpuScheduler::Initialize(
DCHECK(parent_context);
}
- scoped_ptr<gfx::GLSurface> surface(
+ scoped_refptr<gfx::GLSurface> surface(
gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1)));
if (!surface.get()) {
LOG(ERROR) << "CreateOffscreenGLSurface failed.\n";
@@ -38,7 +38,7 @@ bool GpuScheduler::Initialize(
}
// Create a GLContext and attach the surface.
- scoped_ptr<gfx::GLContext> context(
+ scoped_refptr<gfx::GLContext> context(
gfx::GLContext::CreateGLContext(parent_context, surface.get()));
if (!context.get()) {
LOG(ERROR) << "CreateGLContext failed.\n";
@@ -66,8 +66,8 @@ bool GpuScheduler::Initialize(
}
}
- return InitializeCommon(surface.release(),
- context.release(),
+ return InitializeCommon(surface,
+ context,
size,
disallowed_extensions,
allowed_extensions,
diff --git a/gpu/command_buffer/service/gpu_scheduler_win.cc b/gpu/command_buffer/service/gpu_scheduler_win.cc
index a6dcc73..81ab10b 100644
--- a/gpu/command_buffer/service/gpu_scheduler_win.cc
+++ b/gpu/command_buffer/service/gpu_scheduler_win.cc
@@ -32,11 +32,11 @@ bool GpuScheduler::Initialize(
}
// Create either a view or pbuffer based GLSurface.
- scoped_ptr<gfx::GLSurface> surface;
+ scoped_refptr<gfx::GLSurface> surface;
if (window) {
- surface.reset(gfx::GLSurface::CreateViewGLSurface(window));
+ surface = gfx::GLSurface::CreateViewGLSurface(window);
} else {
- surface.reset(gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1)));
+ surface = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1));
}
if (!surface.get()) {
@@ -46,7 +46,7 @@ bool GpuScheduler::Initialize(
}
// Create a GLContext and attach the surface.
- scoped_ptr<gfx::GLContext> context(
+ scoped_refptr<gfx::GLContext> context(
gfx::GLContext::CreateGLContext(parent_context, surface.get()));
if (!context.get()) {
LOG(ERROR) << "CreateGLContext failed.\n";
@@ -54,8 +54,8 @@ bool GpuScheduler::Initialize(
return false;
}
- return InitializeCommon(surface.release(),
- context.release(),
+ return InitializeCommon(surface,
+ context,
size,
disallowed_extensions,
allowed_extensions,
diff --git a/gpu/command_buffer/service/surface_manager.cc b/gpu/command_buffer/service/surface_manager.cc
new file mode 100644
index 0000000..2fca939
--- /dev/null
+++ b/gpu/command_buffer/service/surface_manager.cc
@@ -0,0 +1,15 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "gpu/command_buffer/service/surface_manager.h"
+
+namespace gpu {
+
+SurfaceManager::SurfaceManager() {
+}
+
+SurfaceManager::~SurfaceManager() {
+}
+
+} // namespace gpu
diff --git a/gpu/command_buffer/service/surface_manager.h b/gpu/command_buffer/service/surface_manager.h
new file mode 100644
index 0000000..4caa4ac
--- /dev/null
+++ b/gpu/command_buffer/service/surface_manager.h
@@ -0,0 +1,31 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef GPU_COMMAND_BUFFER_SERVICE_SURFACE_MANAGER_H_
+#define GPU_COMMAND_BUFFER_SERVICE_SURFACE_MANAGER_H_
+
+#include "base/basictypes.h"
+
+namespace gfx {
+class GLSurface;
+}
+
+namespace gpu {
+
+// Interface used to get the GLSurface corresponding to an ID communicated
+// through the command buffer.
+class SurfaceManager {
+ public:
+ SurfaceManager();
+ virtual ~SurfaceManager();
+
+ virtual gfx::GLSurface* LookupSurface(int id) = 0;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(SurfaceManager);
+};
+
+} // namespace gpu
+
+#endif // GPU_COMMAND_BUFFER_SERVICE_SURFACE_MANAGER_H_
diff --git a/gpu/command_buffer/service/surface_manager_mock.h b/gpu/command_buffer/service/surface_manager_mock.h
new file mode 100644
index 0000000..f707ed8
--- /dev/null
+++ b/gpu/command_buffer/service/surface_manager_mock.h
@@ -0,0 +1,23 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef GPU_COMMAND_BUFFER_SERVICE_SURFACE_MANAGER_MOCK_H_
+#define GPU_COMMAND_BUFFER_SERVICE_SURFACE_MANAGER_MOCK_H_
+
+#include "gpu/command_buffer/service/surface_manager.h"
+
+namespace gpu {
+
+class MockSurfaceManager : public SurfaceManager {
+ public:
+ MockSurfaceManager() {}
+ MOCK_METHOD1(LookupSurface, gfx::GLSurface*(int id));
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(MockSurfaceManager);
+};
+
+} // namespace gpu
+
+#endif // GPU_COMMAND_BUFFER_SERVICE_SURFACE_MANAGER_MOCK_H_
diff --git a/gpu/demos/framework/window.cc b/gpu/demos/framework/window.cc
index a0eedcc..4cbfbf6 100644
--- a/gpu/demos/framework/window.cc
+++ b/gpu/demos/framework/window.cc
@@ -60,7 +60,7 @@ bool Window::CreateRenderContext(gfx::PluginWindowHandle hwnd) {
}
GpuScheduler* gpu_scheduler(
- new GpuScheduler(command_buffer.get(), NULL));
+ new GpuScheduler(command_buffer.get(), NULL, NULL));
if (!gpu_scheduler->Initialize(hwnd, gfx::Size(),
gpu::gles2::DisallowedExtensions(),
NULL, std::vector<int32>(),
diff --git a/gpu/gles2_conform_support/egl/display.cc b/gpu/gles2_conform_support/egl/display.cc
index 7bfded1..2308196 100644
--- a/gpu/gles2_conform_support/egl/display.cc
+++ b/gpu/gles2_conform_support/egl/display.cc
@@ -109,7 +109,7 @@ EGLSurface Display::CreateWindowSurface(EGLConfig config,
using gpu::GpuScheduler;
std::vector<int32> attribs;
scoped_ptr<GpuScheduler> gpu_scheduler(
- new GpuScheduler(command_buffer_.get(), NULL));
+ new GpuScheduler(command_buffer_.get(), NULL, NULL));
if (!gpu_scheduler->Initialize(
win, gfx::Size(), gpu::gles2::DisallowedExtensions(), NULL,
attribs, NULL, 0))
diff --git a/gpu/gpu.gyp b/gpu/gpu.gyp
index f59e6f9..0a5dd31 100644
--- a/gpu/gpu.gyp
+++ b/gpu/gpu.gyp
@@ -226,6 +226,8 @@
'command_buffer/service/shader_manager.cc',
'command_buffer/service/shader_translator.h',
'command_buffer/service/shader_translator.cc',
+ 'command_buffer/service/surface_manager.cc',
+ 'command_buffer/service/surface_manager.h',
'command_buffer/service/texture_manager.h',
'command_buffer/service/texture_manager.cc',
],
@@ -293,6 +295,7 @@
'command_buffer/service/renderbuffer_manager_unittest.cc',
'command_buffer/service/shader_manager_unittest.cc',
'command_buffer/service/shader_translator_unittest.cc',
+ 'command_buffer/service/surface_manager_mock.h',
'command_buffer/service/test_helper.cc',
'command_buffer/service/test_helper.h',
'command_buffer/service/texture_manager_unittest.cc',
diff --git a/ui/gfx/compositor/compositor_gl.cc b/ui/gfx/compositor/compositor_gl.cc
index cacf54b..7e6e297 100644
--- a/ui/gfx/compositor/compositor_gl.cc
+++ b/ui/gfx/compositor/compositor_gl.cc
@@ -71,8 +71,8 @@ class CompositorGL : public Compositor {
bool InitShaders();
// The GL context used for compositing.
- scoped_ptr<gfx::GLSurface> gl_surface_;
- scoped_ptr<gfx::GLContext> gl_context_;
+ scoped_refptr<gfx::GLSurface> gl_surface_;
+ scoped_refptr<gfx::GLContext> gl_context_;
gfx::Size size_;
// Shader program, attributes and uniforms.
@@ -205,8 +205,8 @@ void TextureGL::Draw(const ui::Transform& transform) {
CompositorGL::CompositorGL(gfx::AcceleratedWidget widget)
: started_(false) {
- gl_surface_.reset(gfx::GLSurface::CreateViewGLSurface(widget));
- gl_context_.reset(gfx::GLContext::CreateGLContext(NULL, gl_surface_.get())),
+ gl_surface_ = gfx::GLSurface::CreateViewGLSurface(widget);
+ gl_context_ = gfx::GLContext::CreateGLContext(NULL, gl_surface_.get());
gl_context_->MakeCurrent(gl_surface_.get());
if (!InitShaders())
LOG(ERROR) << "Unable to initialize shaders (context = "
@@ -372,8 +372,8 @@ class CompositorGL : public Compositor {
void RestoreTransform() OVERRIDE;
// The GL context used for compositing.
- scoped_ptr<gfx::GLSurface> gl_surface_;
- scoped_ptr<gfx::GLContext> gl_context_;
+ scoped_refptr<gfx::GLSurface> gl_surface_;
+ scoped_refptr<gfx::GLContext> gl_context_;
// Keep track of whether compositing has started or not.
bool started_;
@@ -383,8 +383,8 @@ class CompositorGL : public Compositor {
CompositorGL::CompositorGL(gfx::AcceleratedWidget widget)
: started_(false) {
- gl_surface_.reset(gfx::GLSurface::CreateViewGLSurface(widget));
- gl_context_.reset(gfx::GLContext::CreateGLContext(NULL, gl_surface_.get()));
+ gl_surface_ = gfx::GLSurface::CreateViewGLSurface(widget);
+ gl_context_ = gfx::GLContext::CreateGLContext(NULL, gl_surface_.get());
}
void CompositorGL::NotifyStart() {
diff --git a/ui/gfx/gl/gl_context.cc b/ui/gfx/gl/gl_context.cc
index 6391dc5..9cf1e40 100644
--- a/ui/gfx/gl/gl_context.cc
+++ b/ui/gfx/gl/gl_context.cc
@@ -13,6 +13,12 @@
namespace gfx {
+GLContext::GLContext() {
+}
+
+GLContext::~GLContext() {
+}
+
std::string GLContext::GetExtensions() {
DCHECK(IsCurrent(NULL));
const char* ext = reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS));
diff --git a/ui/gfx/gl/gl_context.h b/ui/gfx/gl/gl_context.h
index 45b944c..77f167f 100644
--- a/ui/gfx/gl/gl_context.h
+++ b/ui/gfx/gl/gl_context.h
@@ -9,16 +9,16 @@
#include <string>
#include "base/basictypes.h"
+#include "base/memory/ref_counted.h"
namespace gfx {
class GLSurface;
// Encapsulates an OpenGL context, hiding platform specific management.
-class GLContext {
+class GLContext : public base::RefCounted<GLContext> {
public:
- GLContext() {}
- virtual ~GLContext() {}
+ GLContext();
// Initializes the GL context to be compatible with the given surface. The GL
// context can be made with other surface's of the same type. The compatible
@@ -56,12 +56,17 @@ class GLContext {
// Create a GL context that is compatible with the given surface.
// |share_context|, if non-NULL, is a context which the
// internally created OpenGL context shares textures and other resources.
- static GLContext* CreateGLContext(GLContext* shared_context,
- GLSurface* compatible_surface);
+ static scoped_refptr<GLContext> CreateGLContext(
+ GLContext* shared_context,
+ GLSurface* compatible_surface);
static bool LosesAllContextsOnContextLost();
+ protected:
+ virtual ~GLContext();
+
private:
+ friend class base::RefCounted<GLContext>;
DISALLOW_COPY_AND_ASSIGN(GLContext);
};
diff --git a/ui/gfx/gl/gl_context_linux.cc b/ui/gfx/gl/gl_context_linux.cc
index b68ed183..8cf2eeb 100644
--- a/ui/gfx/gl/gl_context_linux.cc
+++ b/ui/gfx/gl/gl_context_linux.cc
@@ -20,29 +20,30 @@
namespace gfx {
-GLContext* GLContext::CreateGLContext(GLContext* shared_context,
- GLSurface* compatible_surface) {
+scoped_refptr<GLContext> GLContext::CreateGLContext(
+ GLContext* shared_context,
+ GLSurface* compatible_surface) {
switch (GetGLImplementation()) {
case kGLImplementationOSMesaGL: {
- scoped_ptr<GLContextOSMesa> context(new GLContextOSMesa);
+ scoped_refptr<GLContext> context(new GLContextOSMesa);
if (!context->Initialize(shared_context, compatible_surface))
return NULL;
- return context.release();
+ return context;
}
case kGLImplementationEGLGLES2: {
- scoped_ptr<GLContextEGL> context(new GLContextEGL);
+ scoped_refptr<GLContext> context(new GLContextEGL);
if (!context->Initialize(shared_context, compatible_surface))
return NULL;
- return context.release();
+ return context;
}
case kGLImplementationDesktopGL: {
- scoped_ptr<GLContextGLX> context(new GLContextGLX);
+ scoped_refptr<GLContext> context(new GLContextGLX);
if (!context->Initialize(shared_context, compatible_surface))
return NULL;
- return context.release();
+ return context;
}
case kGLImplementationMockGL:
return new GLContextStub;
diff --git a/ui/gfx/gl/gl_context_mac.cc b/ui/gfx/gl/gl_context_mac.cc
index 5627d2c..482d93d 100644
--- a/ui/gfx/gl/gl_context_mac.cc
+++ b/ui/gfx/gl/gl_context_mac.cc
@@ -16,22 +16,23 @@
namespace gfx {
-GLContext* GLContext::CreateGLContext(GLContext* shared_context,
- GLSurface* compatible_surface) {
+scoped_refptr<GLContext> GLContext::CreateGLContext(
+ GLContext* shared_context,
+ GLSurface* compatible_surface) {
switch (GetGLImplementation()) {
case kGLImplementationDesktopGL: {
- scoped_ptr<GLContextCGL> context(new GLContextCGL);
+ scoped_refptr<GLContext> context(new GLContextCGL);
if (!context->Initialize(shared_context, compatible_surface))
return NULL;
- return context.release();
+ return context;
}
case kGLImplementationOSMesaGL: {
- scoped_ptr<GLContextOSMesa> context(new GLContextOSMesa);
+ scoped_refptr<GLContext> context(new GLContextOSMesa);
if (!context->Initialize(shared_context, compatible_surface))
return NULL;
- return context.release();
+ return context;
}
case kGLImplementationMockGL:
return new GLContextStub;
diff --git a/ui/gfx/gl/gl_context_win.cc b/ui/gfx/gl/gl_context_win.cc
index 90bca79..c9f90706 100644
--- a/ui/gfx/gl/gl_context_win.cc
+++ b/ui/gfx/gl/gl_context_win.cc
@@ -20,29 +20,30 @@
namespace gfx {
-GLContext* GLContext::CreateGLContext(GLContext* shared_context,
- GLSurface* compatible_surface) {
+scoped_refptr<GLContext> GLContext::CreateGLContext(
+ GLContext* shared_context,
+ GLSurface* compatible_surface) {
switch (GetGLImplementation()) {
case kGLImplementationOSMesaGL: {
- scoped_ptr<GLContextOSMesa> context(new GLContextOSMesa);
+ scoped_refptr<GLContext> context(new GLContextOSMesa);
if (!context->Initialize(shared_context, compatible_surface))
return NULL;
- return context.release();
+ return context;
}
case kGLImplementationEGLGLES2: {
- scoped_ptr<GLContextEGL> context(new GLContextEGL);
+ scoped_refptr<GLContext> context(new GLContextEGL);
if (!context->Initialize(shared_context, compatible_surface))
return NULL;
- return context.release();
+ return context;
}
case kGLImplementationDesktopGL: {
- scoped_ptr<GLContextWGL> context(new GLContextWGL);
+ scoped_refptr<GLContext> context(new GLContextWGL);
if (!context->Initialize(shared_context, compatible_surface))
return NULL;
- return context.release();
+ return context;
}
case kGLImplementationMockGL:
return new GLContextStub;
diff --git a/ui/gfx/gl/gl_surface.h b/ui/gfx/gl/gl_surface.h
index 9c1dcc4..513f37d 100644
--- a/ui/gfx/gl/gl_surface.h
+++ b/ui/gfx/gl/gl_surface.h
@@ -6,6 +6,7 @@
#define UI_GFX_GL_GL_SURFACE_H_
#pragma once
+#include "base/memory/ref_counted.h"
#include "build/build_config.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/size.h"
@@ -14,10 +15,9 @@ namespace gfx {
// Encapsulates a surface that can be rendered to with GL, hiding platform
// specific management.
-class GLSurface {
+class GLSurface : public base::RefCounted<GLSurface> {
public:
GLSurface();
- virtual ~GLSurface();
// (Re)create the surface. TODO(apatrick): This is an ugly hack to allow the
// EGL surface associated to be recreated without destroying the associated
@@ -49,13 +49,19 @@ class GLSurface {
#if !defined(OS_MACOSX)
// Create a GL surface that renders directly to a view.
- static GLSurface* CreateViewGLSurface(gfx::PluginWindowHandle window);
+ static scoped_refptr<GLSurface> CreateViewGLSurface(
+ gfx::PluginWindowHandle window);
#endif
// Create a GL surface used for offscreen rendering.
- static GLSurface* CreateOffscreenGLSurface(const gfx::Size& size);
+ static scoped_refptr<GLSurface> CreateOffscreenGLSurface(
+ const gfx::Size& size);
+
+ protected:
+ virtual ~GLSurface();
private:
+ friend class base::RefCounted<GLSurface>;
DISALLOW_COPY_AND_ASSIGN(GLSurface);
};
diff --git a/ui/gfx/gl/gl_surface_linux.cc b/ui/gfx/gl/gl_surface_linux.cc
index 26c1631..fe96989 100644
--- a/ui/gfx/gl/gl_surface_linux.cc
+++ b/ui/gfx/gl/gl_surface_linux.cc
@@ -243,31 +243,32 @@ bool NativeViewGLSurfaceOSMesa::UpdateSize() {
return true;
}
-GLSurface* GLSurface::CreateViewGLSurface(gfx::PluginWindowHandle window) {
+scoped_refptr<GLSurface> GLSurface::CreateViewGLSurface(
+ gfx::PluginWindowHandle window) {
switch (GetGLImplementation()) {
case kGLImplementationOSMesaGL: {
- scoped_ptr<NativeViewGLSurfaceOSMesa> surface(
+ scoped_refptr<GLSurface> surface(
new NativeViewGLSurfaceOSMesa(window));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationEGLGLES2: {
- scoped_ptr<NativeViewGLSurfaceEGL> surface(new NativeViewGLSurfaceEGL(
+ scoped_refptr<GLSurface> surface(new NativeViewGLSurfaceEGL(
window));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationDesktopGL: {
- scoped_ptr<NativeViewGLSurfaceGLX> surface(new NativeViewGLSurfaceGLX(
+ scoped_refptr<GLSurface> surface(new NativeViewGLSurfaceGLX(
window));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationMockGL:
return new GLSurfaceStub;
@@ -277,29 +278,30 @@ GLSurface* GLSurface::CreateViewGLSurface(gfx::PluginWindowHandle window) {
}
}
-GLSurface* GLSurface::CreateOffscreenGLSurface(const gfx::Size& size) {
+scoped_refptr<GLSurface> GLSurface::CreateOffscreenGLSurface(
+ const gfx::Size& size) {
switch (GetGLImplementation()) {
case kGLImplementationOSMesaGL: {
- scoped_ptr<GLSurfaceOSMesa> surface(new GLSurfaceOSMesa(OSMESA_RGBA,
- size));
+ scoped_refptr<GLSurface> surface(new GLSurfaceOSMesa(OSMESA_RGBA,
+ size));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationEGLGLES2: {
- scoped_ptr<PbufferGLSurfaceEGL> surface(new PbufferGLSurfaceEGL(size));
+ scoped_refptr<GLSurface> surface(new PbufferGLSurfaceEGL(size));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationDesktopGL: {
- scoped_ptr<PbufferGLSurfaceGLX> surface(new PbufferGLSurfaceGLX(size));
+ scoped_refptr<GLSurface> surface(new PbufferGLSurfaceGLX(size));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationMockGL:
return new GLSurfaceStub;
diff --git a/ui/gfx/gl/gl_surface_mac.cc b/ui/gfx/gl/gl_surface_mac.cc
index bb08ef8..2367679 100644
--- a/ui/gfx/gl/gl_surface_mac.cc
+++ b/ui/gfx/gl/gl_surface_mac.cc
@@ -50,23 +50,24 @@ bool GLSurface::InitializeOneOff() {
// TODO(apatrick): support ViewGLSurface on mac.
#if 0
-GLSurface* GLSurface::CreateViewGLSurface(gfx::PluginWindowHandle window) {
+scoped_refptr<GLSurface> GLSurface::CreateViewGLSurface(
+ gfx::PluginWindowHandle window) {
switch (GetGLImplementation()) {
case kGLImplementationOSMesaGL: {
- scoped_ptr<NativeViewGLSurfaceOSMesa> surface(
+ scoped_refptr<GLSurface> surface(
new NativeViewGLSurfaceOSMesa(window));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationDesktopGL: {
- scoped_ptr<NativeViewGLSurfaceCGL> surface(new NativeViewGLSurfaceCGL(
+ scoped_refptr<GLSurface> surface(new NativeViewGLSurfaceCGL(
window));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationMockGL:
return new GLSurfaceStub;
@@ -77,22 +78,23 @@ GLSurface* GLSurface::CreateViewGLSurface(gfx::PluginWindowHandle window) {
}
#endif
-GLSurface* GLSurface::CreateOffscreenGLSurface(const gfx::Size& size) {
+scoped_refptr<GLSurface> GLSurface::CreateOffscreenGLSurface(
+ const gfx::Size& size) {
switch (GetGLImplementation()) {
case kGLImplementationOSMesaGL: {
- scoped_ptr<GLSurfaceOSMesa> surface(new GLSurfaceOSMesa(OSMESA_RGBA,
- size));
+ scoped_refptr<GLSurface> surface(new GLSurfaceOSMesa(OSMESA_RGBA,
+ size));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationDesktopGL: {
- scoped_ptr<PbufferGLSurfaceCGL> surface(new PbufferGLSurfaceCGL(size));
+ scoped_refptr<GLSurface> surface(new PbufferGLSurfaceCGL(size));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationMockGL:
return new GLSurfaceStub;
diff --git a/ui/gfx/gl/gl_surface_win.cc b/ui/gfx/gl/gl_surface_win.cc
index 594a263..6b3ea8c 100644
--- a/ui/gfx/gl/gl_surface_win.cc
+++ b/ui/gfx/gl/gl_surface_win.cc
@@ -167,31 +167,32 @@ void NativeViewGLSurfaceOSMesa::UpdateSize() {
Resize(window_size);
}
-GLSurface* GLSurface::CreateViewGLSurface(gfx::PluginWindowHandle window) {
+scoped_refptr<GLSurface> GLSurface::CreateViewGLSurface(
+ gfx::PluginWindowHandle window) {
switch (GetGLImplementation()) {
case kGLImplementationOSMesaGL: {
- scoped_ptr<NativeViewGLSurfaceOSMesa> surface(
+ scoped_refptr<GLSurface> surface(
new NativeViewGLSurfaceOSMesa(window));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationEGLGLES2: {
- scoped_ptr<NativeViewGLSurfaceEGL> surface(new NativeViewGLSurfaceEGL(
+ scoped_refptr<GLSurface> surface(new NativeViewGLSurfaceEGL(
window));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationDesktopGL: {
- scoped_ptr<NativeViewGLSurfaceWGL> surface(new NativeViewGLSurfaceWGL(
+ scoped_refptr<GLSurface> surface(new NativeViewGLSurfaceWGL(
window));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationMockGL:
return new GLSurfaceStub;
@@ -201,29 +202,30 @@ GLSurface* GLSurface::CreateViewGLSurface(gfx::PluginWindowHandle window) {
}
}
-GLSurface* GLSurface::CreateOffscreenGLSurface(const gfx::Size& size) {
+scoped_refptr<GLSurface> GLSurface::CreateOffscreenGLSurface(
+ const gfx::Size& size) {
switch (GetGLImplementation()) {
case kGLImplementationOSMesaGL: {
- scoped_ptr<GLSurfaceOSMesa> surface(new GLSurfaceOSMesa(OSMESA_RGBA,
- size));
+ scoped_refptr<GLSurface> surface(new GLSurfaceOSMesa(OSMESA_RGBA,
+ size));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationEGLGLES2: {
- scoped_ptr<PbufferGLSurfaceEGL> surface(new PbufferGLSurfaceEGL(size));
+ scoped_refptr<GLSurface> surface(new PbufferGLSurfaceEGL(size));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationDesktopGL: {
- scoped_ptr<PbufferGLSurfaceWGL> surface(new PbufferGLSurfaceWGL(size));
+ scoped_refptr<GLSurface> surface(new PbufferGLSurfaceWGL(size));
if (!surface->Initialize())
return NULL;
- return surface.release();
+ return surface;
}
case kGLImplementationMockGL:
return new GLSurfaceStub;
diff --git a/ui/gfx/surface/accelerated_surface_mac.cc b/ui/gfx/surface/accelerated_surface_mac.cc
index a749c46..ce2f7a0 100644
--- a/ui/gfx/surface/accelerated_surface_mac.cc
+++ b/ui/gfx/surface/accelerated_surface_mac.cc
@@ -35,14 +35,14 @@ bool AcceleratedSurface::Initialize(gfx::GLContext* share_context,
if (gfx::GetGLImplementation() != gfx::kGLImplementationDesktopGL)
return false;
- gl_surface_.reset(gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1)));
+ gl_surface_ = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1));
if (!gl_surface_.get()) {
Destroy();
return false;
}
- gl_context_.reset(gfx::GLContext::CreateGLContext(share_context,
- gl_surface_.get()));
+ gl_context_ = gfx::GLContext::CreateGLContext(share_context,
+ gl_surface_.get());
if (!gl_context_.get()) {
Destroy();
return false;
@@ -66,8 +66,8 @@ void AcceleratedSurface::Destroy() {
}
transport_dib_.reset();
- gl_context_.reset();
- gl_surface_.reset();
+ gl_context_ = NULL;
+ gl_surface_ = NULL;
}
// Call after making changes to the surface which require a visual update.
diff --git a/ui/gfx/surface/accelerated_surface_mac.h b/ui/gfx/surface/accelerated_surface_mac.h
index 13bec9b..d9ee833 100644
--- a/ui/gfx/surface/accelerated_surface_mac.h
+++ b/ui/gfx/surface/accelerated_surface_mac.h
@@ -129,8 +129,8 @@ class AcceleratedSurface {
// speaking, we do not need to allocate a GL context all of the
// time. We only need one if (a) we are using the IOSurface code
// path, or (b) if we are allocating an FBO internally.
- scoped_ptr<gfx::GLSurface> gl_surface_;
- scoped_ptr<gfx::GLContext> gl_context_;
+ scoped_refptr<gfx::GLSurface> gl_surface_;
+ scoped_refptr<gfx::GLContext> gl_context_;
// Either |io_surface_| or |transport_dib_| is a valid pointer, but not both.
// |io_surface_| is non-NULL if the IOSurface APIs are supported (Mac OS X
// 10.6 and later).
diff --git a/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc b/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
index 62439d8..dfb4959 100644
--- a/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
+++ b/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.cc
@@ -10,6 +10,7 @@
#include <string>
#include "base/logging.h"
+#include "base/memory/scoped_ptr.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
@@ -133,7 +134,7 @@ bool WebGraphicsContext3DInProcessCommandBufferImpl::initialize(
// and from there to the window, and WebViewImpl::paint already
// correctly handles the case where the compositor is active but
// the output needs to go to a WebCanvas.
- gl_surface_.reset(gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1)));
+ gl_surface_ = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1));
if (!gl_surface_.get()) {
if (!is_gles2_)
@@ -148,14 +149,13 @@ bool WebGraphicsContext3DInProcessCommandBufferImpl::initialize(
// necessary.
webView->mainFrame()->collectGarbage();
- gl_surface_.reset(gfx::GLSurface::CreateOffscreenGLSurface(
- gfx::Size(1, 1)));
+ gl_surface_ = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1));
if (!gl_surface_.get())
return false;
}
- gl_context_.reset(gfx::GLContext::CreateGLContext(share_context,
- gl_surface_.get()));
+ gl_context_ = gfx::GLContext::CreateGLContext(share_context,
+ gl_surface_.get());
if (!gl_context_.get()) {
if (!is_gles2_)
return false;
@@ -169,8 +169,8 @@ bool WebGraphicsContext3DInProcessCommandBufferImpl::initialize(
// necessary.
webView->mainFrame()->collectGarbage();
- gl_context_.reset(gfx::GLContext::CreateGLContext(share_context,
- gl_surface_.get()));
+ gl_context_ = gfx::GLContext::CreateGLContext(share_context,
+ gl_surface_.get());
if (!gl_context_.get())
return false;
}
@@ -189,7 +189,7 @@ bool WebGraphicsContext3DInProcessCommandBufferImpl::initialize(
attributes_.antialias = false;
if (!gl_context_->MakeCurrent(gl_surface_.get())) {
- gl_context_.reset();
+ gl_context_ = NULL;
return false;
}
diff --git a/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h b/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h
index 08c8df1..dc51c80 100644
--- a/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h
+++ b/webkit/gpu/webgraphicscontext3d_in_process_command_buffer_impl.h
@@ -9,7 +9,7 @@
#include <set>
#include "base/hash_tables.h"
-#include "base/memory/scoped_ptr.h"
+#include "base/memory/ref_counted.h"
#include "third_party/angle/include/GLSLANG/ShaderLang.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebGraphicsContext3D.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
@@ -464,8 +464,8 @@ class WebGraphicsContext3DInProcessCommandBufferImpl : public WebGraphicsContext
std::list<WGC3Denum> synthetic_errors_list_;
std::set<WGC3Denum> synthetic_errors_set_;
- scoped_ptr<gfx::GLContext> gl_context_;
- scoped_ptr<gfx::GLSurface> gl_surface_;
+ scoped_refptr<gfx::GLContext> gl_context_;
+ scoped_refptr<gfx::GLSurface> gl_surface_;
ShaderSourceMap shader_source_map_;
diff --git a/webkit/gpu/webgraphicscontext3d_in_process_impl.cc b/webkit/gpu/webgraphicscontext3d_in_process_impl.cc
index f2fc2e9..f79f4a6 100644
--- a/webkit/gpu/webgraphicscontext3d_in_process_impl.cc
+++ b/webkit/gpu/webgraphicscontext3d_in_process_impl.cc
@@ -10,6 +10,7 @@
#include <string>
#include "base/logging.h"
+#include "base/memory/scoped_ptr.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
@@ -134,8 +135,7 @@ bool WebGraphicsContext3DInProcessImpl::initialize(
// and from there to the window, and WebViewImpl::paint already
// correctly handles the case where the compositor is active but
// the output needs to go to a WebCanvas.
- gl_surface_.reset(gfx::GLSurface::CreateOffscreenGLSurface(
- gfx::Size(1, 1)));
+ gl_surface_ = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1));
if (!gl_surface_.get()) {
if (!is_gles2_)
return false;
@@ -149,14 +149,13 @@ bool WebGraphicsContext3DInProcessImpl::initialize(
// necessary.
webView->mainFrame()->collectGarbage();
- gl_surface_.reset(
- gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1)));
+ gl_surface_ = gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1));
if (!gl_surface_.get())
return false;
}
- gl_context_.reset(gfx::GLContext::CreateGLContext(share_context,
- gl_surface_.get()));
+ gl_context_ = gfx::GLContext::CreateGLContext(share_context,
+ gl_surface_.get());
if (!gl_context_.get()) {
if (!is_gles2_)
return false;
@@ -170,8 +169,8 @@ bool WebGraphicsContext3DInProcessImpl::initialize(
// necessary.
webView->mainFrame()->collectGarbage();
- gl_context_.reset(gfx::GLContext::CreateGLContext(share_context,
- gl_surface_.get()));
+ gl_context_ = gfx::GLContext::CreateGLContext(share_context,
+ gl_surface_.get());
if (!gl_context_.get())
return false;
}
@@ -190,7 +189,7 @@ bool WebGraphicsContext3DInProcessImpl::initialize(
attributes_.antialias = false;
if (!gl_context_->MakeCurrent(gl_surface_.get())) {
- gl_context_.reset();
+ gl_context_ = NULL;
return false;
}
diff --git a/webkit/gpu/webgraphicscontext3d_in_process_impl.h b/webkit/gpu/webgraphicscontext3d_in_process_impl.h
index ae3fac2..304f9fb 100644
--- a/webkit/gpu/webgraphicscontext3d_in_process_impl.h
+++ b/webkit/gpu/webgraphicscontext3d_in_process_impl.h
@@ -9,7 +9,7 @@
#include <set>
#include "base/hash_tables.h"
-#include "base/memory/scoped_ptr.h"
+#include "base/memory/ref_counted.h"
#include "third_party/angle/include/GLSLANG/ShaderLang.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebGraphicsContext3D.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
@@ -468,8 +468,8 @@ class WebGraphicsContext3DInProcessImpl : public WebGraphicsContext3D {
std::list<WGC3Denum> synthetic_errors_list_;
std::set<WGC3Denum> synthetic_errors_set_;
- scoped_ptr<gfx::GLContext> gl_context_;
- scoped_ptr<gfx::GLSurface> gl_surface_;
+ scoped_refptr<gfx::GLContext> gl_context_;
+ scoped_refptr<gfx::GLSurface> gl_surface_;
ShaderSourceMap shader_source_map_;