OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "build/build_config.h" | 5 #include "build/build_config.h" |
6 | 6 |
7 #include "base/ref_counted.h" | 7 #include "base/ref_counted.h" |
8 #include "base/singleton.h" | 8 #include "base/singleton.h" |
9 #include "base/thread_local.h" | 9 #include "base/thread_local.h" |
| 10 #include "base/weak_ptr.h" |
10 #include "chrome/renderer/command_buffer_proxy.h" | 11 #include "chrome/renderer/command_buffer_proxy.h" |
11 #include "chrome/renderer/ggl/ggl.h" | 12 #include "chrome/renderer/ggl/ggl.h" |
12 #include "chrome/renderer/gpu_channel_host.h" | 13 #include "chrome/renderer/gpu_channel_host.h" |
13 #include "chrome/renderer/render_widget.h" | 14 #include "chrome/renderer/render_widget.h" |
14 #include "ipc/ipc_channel_handle.h" | 15 #include "ipc/ipc_channel_handle.h" |
15 | 16 |
16 #if defined(ENABLE_GPU) | 17 #if defined(ENABLE_GPU) |
17 #include "gpu/command_buffer/client/gles2_cmd_helper.h" | 18 #include "gpu/command_buffer/client/gles2_cmd_helper.h" |
18 #include "gpu/command_buffer/client/gles2_implementation.h" | 19 #include "gpu/command_buffer/client/gles2_implementation.h" |
19 #include "gpu/command_buffer/client/gles2_lib.h" | 20 #include "gpu/command_buffer/client/gles2_lib.h" |
(...skipping 24 matching lines...) Expand all Loading... |
44 ~GLES2Initializer() { | 45 ~GLES2Initializer() { |
45 gles2::Terminate(); | 46 gles2::Terminate(); |
46 } | 47 } |
47 | 48 |
48 private: | 49 private: |
49 DISALLOW_COPY_AND_ASSIGN(GLES2Initializer); | 50 DISALLOW_COPY_AND_ASSIGN(GLES2Initializer); |
50 }; | 51 }; |
51 } // namespace anonymous | 52 } // namespace anonymous |
52 | 53 |
53 // Manages a GL context. | 54 // Manages a GL context. |
54 class Context { | 55 class Context : public base::SupportsWeakPtr<Context> { |
55 public: | 56 public: |
56 Context(GpuChannelHost* channel, Context* parent); | 57 Context(GpuChannelHost* channel, Context* parent); |
57 ~Context(); | 58 ~Context(); |
58 | 59 |
59 // Initialize a GGL context that can be used in association with a a GPU | 60 // Initialize a GGL context that can be used in association with a a GPU |
60 // channel acquired from a RenderWidget or RenderView. | 61 // channel acquired from a RenderWidget or RenderView. |
61 bool Initialize(gfx::NativeViewId view, const gfx::Size& size); | 62 bool Initialize(gfx::NativeViewId view, const gfx::Size& size); |
62 | 63 |
63 // Asynchronously resizes an offscreen frame buffer. | 64 // Asynchronously resizes an offscreen frame buffer. |
64 void ResizeOffscreen(const gfx::Size& size); | 65 void ResizeOffscreen(const gfx::Size& size); |
(...skipping 16 matching lines...) Expand all Loading... |
81 bool SwapBuffers(); | 82 bool SwapBuffers(); |
82 | 83 |
83 // Get the current error code. | 84 // Get the current error code. |
84 Error GetError(); | 85 Error GetError(); |
85 | 86 |
86 // TODO(gman): Remove this. | 87 // TODO(gman): Remove this. |
87 void DisableShaderTranslation(); | 88 void DisableShaderTranslation(); |
88 | 89 |
89 private: | 90 private: |
90 scoped_refptr<GpuChannelHost> channel_; | 91 scoped_refptr<GpuChannelHost> channel_; |
91 Context* parent_; | 92 base::WeakPtr<Context> parent_; |
92 uint32 parent_texture_id_; | 93 uint32 parent_texture_id_; |
93 CommandBufferProxy* command_buffer_; | 94 CommandBufferProxy* command_buffer_; |
94 gpu::gles2::GLES2CmdHelper* gles2_helper_; | 95 gpu::gles2::GLES2CmdHelper* gles2_helper_; |
95 int32 transfer_buffer_id_; | 96 int32 transfer_buffer_id_; |
96 gpu::gles2::GLES2Implementation* gles2_implementation_; | 97 gpu::gles2::GLES2Implementation* gles2_implementation_; |
97 | 98 |
98 DISALLOW_COPY_AND_ASSIGN(Context); | 99 DISALLOW_COPY_AND_ASSIGN(Context); |
99 }; | 100 }; |
100 | 101 |
101 Context::Context(GpuChannelHost* channel, Context* parent) | 102 Context::Context(GpuChannelHost* channel, Context* parent) |
102 : channel_(channel), | 103 : channel_(channel), |
103 parent_(parent), | 104 parent_(parent ? parent->AsWeakPtr() : base::WeakPtr<Context>()), |
104 parent_texture_id_(0), | 105 parent_texture_id_(0), |
105 command_buffer_(NULL), | 106 command_buffer_(NULL), |
106 gles2_helper_(NULL), | 107 gles2_helper_(NULL), |
107 transfer_buffer_id_(0), | 108 transfer_buffer_id_(0), |
108 gles2_implementation_(NULL) { | 109 gles2_implementation_(NULL) { |
109 DCHECK(channel); | 110 DCHECK(channel); |
110 } | 111 } |
111 | 112 |
112 Context::~Context() { | 113 Context::~Context() { |
113 Destroy(); | 114 Destroy(); |
114 } | 115 } |
115 | 116 |
116 bool Context::Initialize(gfx::NativeViewId view, const gfx::Size& size) { | 117 bool Context::Initialize(gfx::NativeViewId view, const gfx::Size& size) { |
117 DCHECK(size.width() >= 0 && size.height() >= 0); | 118 DCHECK(size.width() >= 0 && size.height() >= 0); |
118 | 119 |
119 if (!channel_->ready()) | 120 if (!channel_->ready()) |
120 return false; | 121 return false; |
121 | 122 |
122 // Ensure the gles2 library is initialized first in a thread safe way. | 123 // Ensure the gles2 library is initialized first in a thread safe way. |
123 Singleton<GLES2Initializer>::get(); | 124 Singleton<GLES2Initializer>::get(); |
124 | 125 |
125 // Allocate a frame buffer ID with respect to the parent. | 126 // Allocate a frame buffer ID with respect to the parent. |
126 if (parent_) { | 127 if (parent_.get()) { |
127 // Flush any remaining commands in the parent context to make sure the | 128 // Flush any remaining commands in the parent context to make sure the |
128 // texture id accounting stays consistent. | 129 // texture id accounting stays consistent. |
129 int32 token = parent_->gles2_helper_->InsertToken(); | 130 int32 token = parent_->gles2_helper_->InsertToken(); |
130 parent_->gles2_helper_->WaitForToken(token); | 131 parent_->gles2_helper_->WaitForToken(token); |
131 parent_texture_id_ = parent_->gles2_implementation_->MakeTextureId(); | 132 parent_texture_id_ = parent_->gles2_implementation_->MakeTextureId(); |
132 } | 133 } |
133 | 134 |
134 // Create a proxy to a command buffer in the GPU process. | 135 // Create a proxy to a command buffer in the GPU process. |
135 if (view) { | 136 if (view) { |
136 command_buffer_ = channel_->CreateViewCommandBuffer(view); | 137 command_buffer_ = channel_->CreateViewCommandBuffer(view); |
137 } else { | 138 } else { |
138 CommandBufferProxy* parent_command_buffer = | 139 CommandBufferProxy* parent_command_buffer = |
139 parent_ ? parent_->command_buffer_ : NULL; | 140 parent_.get() ? parent_->command_buffer_ : NULL; |
140 command_buffer_ = channel_->CreateOffscreenCommandBuffer( | 141 command_buffer_ = channel_->CreateOffscreenCommandBuffer( |
141 parent_command_buffer, | 142 parent_command_buffer, |
142 size, | 143 size, |
143 parent_texture_id_); | 144 parent_texture_id_); |
144 } | 145 } |
145 if (!command_buffer_) { | 146 if (!command_buffer_) { |
146 Destroy(); | 147 Destroy(); |
147 return false; | 148 return false; |
148 } | 149 } |
149 | 150 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 | 188 |
188 return true; | 189 return true; |
189 } | 190 } |
190 | 191 |
191 void Context::ResizeOffscreen(const gfx::Size& size) { | 192 void Context::ResizeOffscreen(const gfx::Size& size) { |
192 DCHECK(size.width() > 0 && size.height() > 0); | 193 DCHECK(size.width() > 0 && size.height() > 0); |
193 command_buffer_->ResizeOffscreenFrameBuffer(size); | 194 command_buffer_->ResizeOffscreenFrameBuffer(size); |
194 } | 195 } |
195 | 196 |
196 void Context::Destroy() { | 197 void Context::Destroy() { |
197 if (parent_ && parent_texture_id_ != 0) | 198 if (parent_.get() && parent_texture_id_ != 0) |
198 parent_->gles2_implementation_->FreeTextureId(parent_texture_id_); | 199 parent_->gles2_implementation_->FreeTextureId(parent_texture_id_); |
199 | 200 |
200 delete gles2_implementation_; | 201 delete gles2_implementation_; |
201 gles2_implementation_ = NULL; | 202 gles2_implementation_ = NULL; |
202 | 203 |
203 if (command_buffer_ && transfer_buffer_id_ != 0) { | 204 if (command_buffer_ && transfer_buffer_id_ != 0) { |
204 command_buffer_->DestroyTransferBuffer(transfer_buffer_id_); | 205 command_buffer_->DestroyTransferBuffer(transfer_buffer_id_); |
205 transfer_buffer_id_ = 0; | 206 transfer_buffer_id_ = 0; |
206 } | 207 } |
207 | 208 |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 | 360 |
360 // TODO(gman): Remove This | 361 // TODO(gman): Remove This |
361 void DisableShaderTranslation(Context* context) { | 362 void DisableShaderTranslation(Context* context) { |
362 #if defined(ENABLE_GPU) | 363 #if defined(ENABLE_GPU) |
363 if (context) { | 364 if (context) { |
364 context->DisableShaderTranslation(); | 365 context->DisableShaderTranslation(); |
365 } | 366 } |
366 #endif | 367 #endif |
367 } | 368 } |
368 } // namespace ggl | 369 } // namespace ggl |
OLD | NEW |