| 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 "base/weak_ptr.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 } // namespace anonymous | 52 } // namespace anonymous |
| 53 | 53 |
| 54 // Manages a GL context. | 54 // Manages a GL context. |
| 55 class Context : public base::SupportsWeakPtr<Context> { | 55 class Context : public base::SupportsWeakPtr<Context> { |
| 56 public: | 56 public: |
| 57 Context(GpuChannelHost* channel, Context* parent); | 57 Context(GpuChannelHost* channel, Context* parent); |
| 58 ~Context(); | 58 ~Context(); |
| 59 | 59 |
| 60 // 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 |
| 61 // channel acquired from a RenderWidget or RenderView. | 61 // channel acquired from a RenderWidget or RenderView. |
| 62 bool Initialize(gfx::NativeViewId view, const gfx::Size& size); | 62 bool Initialize(gfx::NativeViewId view, |
| 63 int render_view_id, |
| 64 const gfx::Size& size); |
| 65 |
| 66 #if defined(OS_MACOSX) |
| 67 // Asynchronously resizes an onscreen frame buffer. |
| 68 void ResizeOnscreen(const gfx::Size& size); |
| 69 #endif |
| 63 | 70 |
| 64 // Asynchronously resizes an offscreen frame buffer. | 71 // Asynchronously resizes an offscreen frame buffer. |
| 65 void ResizeOffscreen(const gfx::Size& size); | 72 void ResizeOffscreen(const gfx::Size& size); |
| 66 | 73 |
| 67 // For an offscreen frame buffer context, return the frame buffer ID with | 74 // For an offscreen frame buffer context, return the frame buffer ID with |
| 68 // respect to the parent. | 75 // respect to the parent. |
| 69 uint32 parent_texture_id() const { | 76 uint32 parent_texture_id() const { |
| 70 return parent_texture_id_; | 77 return parent_texture_id_; |
| 71 } | 78 } |
| 72 | 79 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 gles2_helper_(NULL), | 114 gles2_helper_(NULL), |
| 108 transfer_buffer_id_(0), | 115 transfer_buffer_id_(0), |
| 109 gles2_implementation_(NULL) { | 116 gles2_implementation_(NULL) { |
| 110 DCHECK(channel); | 117 DCHECK(channel); |
| 111 } | 118 } |
| 112 | 119 |
| 113 Context::~Context() { | 120 Context::~Context() { |
| 114 Destroy(); | 121 Destroy(); |
| 115 } | 122 } |
| 116 | 123 |
| 117 bool Context::Initialize(gfx::NativeViewId view, const gfx::Size& size) { | 124 bool Context::Initialize(gfx::NativeViewId view, |
| 125 int render_view_id, |
| 126 const gfx::Size& size) { |
| 118 DCHECK(size.width() >= 0 && size.height() >= 0); | 127 DCHECK(size.width() >= 0 && size.height() >= 0); |
| 119 | 128 |
| 120 if (channel_->state() != GpuChannelHost::CONNECTED) | 129 if (channel_->state() != GpuChannelHost::CONNECTED) |
| 121 return false; | 130 return false; |
| 122 | 131 |
| 123 // Ensure the gles2 library is initialized first in a thread safe way. | 132 // Ensure the gles2 library is initialized first in a thread safe way. |
| 124 Singleton<GLES2Initializer>::get(); | 133 Singleton<GLES2Initializer>::get(); |
| 125 | 134 |
| 126 // Allocate a frame buffer ID with respect to the parent. | 135 // Allocate a frame buffer ID with respect to the parent. |
| 127 if (parent_.get()) { | 136 if (parent_.get()) { |
| 128 // Flush any remaining commands in the parent context to make sure the | 137 // Flush any remaining commands in the parent context to make sure the |
| 129 // texture id accounting stays consistent. | 138 // texture id accounting stays consistent. |
| 130 int32 token = parent_->gles2_helper_->InsertToken(); | 139 int32 token = parent_->gles2_helper_->InsertToken(); |
| 131 parent_->gles2_helper_->WaitForToken(token); | 140 parent_->gles2_helper_->WaitForToken(token); |
| 132 parent_texture_id_ = parent_->gles2_implementation_->MakeTextureId(); | 141 parent_texture_id_ = parent_->gles2_implementation_->MakeTextureId(); |
| 133 } | 142 } |
| 134 | 143 |
| 135 // Create a proxy to a command buffer in the GPU process. | 144 // Create a proxy to a command buffer in the GPU process. |
| 136 if (view) { | 145 if (view) { |
| 137 command_buffer_ = channel_->CreateViewCommandBuffer(view); | 146 command_buffer_ = |
| 147 channel_->CreateViewCommandBuffer(view, render_view_id); |
| 138 } else { | 148 } else { |
| 139 CommandBufferProxy* parent_command_buffer = | 149 CommandBufferProxy* parent_command_buffer = |
| 140 parent_.get() ? parent_->command_buffer_ : NULL; | 150 parent_.get() ? parent_->command_buffer_ : NULL; |
| 141 command_buffer_ = channel_->CreateOffscreenCommandBuffer( | 151 command_buffer_ = channel_->CreateOffscreenCommandBuffer( |
| 142 parent_command_buffer, | 152 parent_command_buffer, |
| 143 size, | 153 size, |
| 144 parent_texture_id_); | 154 parent_texture_id_); |
| 145 } | 155 } |
| 146 if (!command_buffer_) { | 156 if (!command_buffer_) { |
| 147 Destroy(); | 157 Destroy(); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 gles2_implementation_ = new gpu::gles2::GLES2Implementation( | 192 gles2_implementation_ = new gpu::gles2::GLES2Implementation( |
| 183 gles2_helper_, | 193 gles2_helper_, |
| 184 transfer_buffer.size, | 194 transfer_buffer.size, |
| 185 transfer_buffer.ptr, | 195 transfer_buffer.ptr, |
| 186 transfer_buffer_id_, | 196 transfer_buffer_id_, |
| 187 false); | 197 false); |
| 188 | 198 |
| 189 return true; | 199 return true; |
| 190 } | 200 } |
| 191 | 201 |
| 202 #if defined(OS_MACOSX) |
| 203 void Context::ResizeOnscreen(const gfx::Size& size) { |
| 204 DCHECK(size.width() > 0 && size.height() > 0); |
| 205 command_buffer_->SetWindowSize(size); |
| 206 } |
| 207 #endif |
| 208 |
| 192 void Context::ResizeOffscreen(const gfx::Size& size) { | 209 void Context::ResizeOffscreen(const gfx::Size& size) { |
| 193 DCHECK(size.width() > 0 && size.height() > 0); | 210 DCHECK(size.width() > 0 && size.height() > 0); |
| 194 command_buffer_->ResizeOffscreenFrameBuffer(size); | 211 command_buffer_->ResizeOffscreenFrameBuffer(size); |
| 195 } | 212 } |
| 196 | 213 |
| 197 void Context::Destroy() { | 214 void Context::Destroy() { |
| 198 if (parent_.get() && parent_texture_id_ != 0) | 215 if (parent_.get() && parent_texture_id_ != 0) |
| 199 parent_->gles2_implementation_->FreeTextureId(parent_texture_id_); | 216 parent_->gles2_implementation_->FreeTextureId(parent_texture_id_); |
| 200 | 217 |
| 201 delete gles2_implementation_; | 218 delete gles2_implementation_; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 } | 274 } |
| 258 } | 275 } |
| 259 | 276 |
| 260 // TODO(gman): Remove This | 277 // TODO(gman): Remove This |
| 261 void Context::DisableShaderTranslation() { | 278 void Context::DisableShaderTranslation() { |
| 262 gles2_implementation_->CommandBufferEnable(PEPPER3D_SKIP_GLSL_TRANSLATION); | 279 gles2_implementation_->CommandBufferEnable(PEPPER3D_SKIP_GLSL_TRANSLATION); |
| 263 } | 280 } |
| 264 | 281 |
| 265 #endif // ENABLE_GPU | 282 #endif // ENABLE_GPU |
| 266 | 283 |
| 267 Context* CreateViewContext(GpuChannelHost* channel, gfx::NativeViewId view) { | 284 Context* CreateViewContext(GpuChannelHost* channel, |
| 285 gfx::NativeViewId view, |
| 286 int render_view_id) { |
| 268 #if defined(ENABLE_GPU) | 287 #if defined(ENABLE_GPU) |
| 269 scoped_ptr<Context> context(new Context(channel, NULL)); | 288 scoped_ptr<Context> context(new Context(channel, NULL)); |
| 270 if (!context->Initialize(view, gfx::Size())) | 289 if (!context->Initialize(view, render_view_id, gfx::Size())) |
| 271 return NULL; | 290 return NULL; |
| 272 | 291 |
| 273 return context.release(); | 292 return context.release(); |
| 274 #else | 293 #else |
| 275 return NULL; | 294 return NULL; |
| 276 #endif | 295 #endif |
| 277 } | 296 } |
| 278 | 297 |
| 298 #if defined(OS_MACOSX) |
| 299 void ResizeOnscreenContext(Context* context, const gfx::Size& size) { |
| 300 #if defined(ENABLE_GPU) |
| 301 context->ResizeOnscreen(size); |
| 302 #endif |
| 303 } |
| 304 #endif |
| 305 |
| 279 Context* CreateOffscreenContext(GpuChannelHost* channel, | 306 Context* CreateOffscreenContext(GpuChannelHost* channel, |
| 280 Context* parent, | 307 Context* parent, |
| 281 const gfx::Size& size) { | 308 const gfx::Size& size) { |
| 282 #if defined(ENABLE_GPU) | 309 #if defined(ENABLE_GPU) |
| 283 scoped_ptr<Context> context(new Context(channel, parent)); | 310 scoped_ptr<Context> context(new Context(channel, parent)); |
| 284 if (!context->Initialize(0, size)) | 311 if (!context->Initialize(0, 0, size)) |
| 285 return NULL; | 312 return NULL; |
| 286 | 313 |
| 287 return context.release(); | 314 return context.release(); |
| 288 #else | 315 #else |
| 289 return NULL; | 316 return NULL; |
| 290 #endif | 317 #endif |
| 291 } | 318 } |
| 292 | 319 |
| 293 void ResizeOffscreenContext(Context* context, const gfx::Size& size) { | 320 void ResizeOffscreenContext(Context* context, const gfx::Size& size) { |
| 294 #if defined(ENABLE_GPU) | 321 #if defined(ENABLE_GPU) |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 | 387 |
| 361 // TODO(gman): Remove This | 388 // TODO(gman): Remove This |
| 362 void DisableShaderTranslation(Context* context) { | 389 void DisableShaderTranslation(Context* context) { |
| 363 #if defined(ENABLE_GPU) | 390 #if defined(ENABLE_GPU) |
| 364 if (context) { | 391 if (context) { |
| 365 context->DisableShaderTranslation(); | 392 context->DisableShaderTranslation(); |
| 366 } | 393 } |
| 367 #endif | 394 #endif |
| 368 } | 395 } |
| 369 } // namespace ggl | 396 } // namespace ggl |
| OLD | NEW |