| 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 "app/gfx/gl/gl_context.h" | 5 #include "app/gfx/gl/gl_context.h" |
| 6 #include "gpu/command_buffer/service/gpu_processor.h" | 6 #include "gpu/command_buffer/service/gpu_processor.h" |
| 7 | 7 |
| 8 using ::base::SharedMemory; | 8 using ::base::SharedMemory; |
| 9 | 9 |
| 10 namespace gpu { | 10 namespace gpu { |
| 11 | 11 |
| 12 bool GPUProcessor::Initialize(gfx::PluginWindowHandle window, | 12 bool GPUProcessor::Initialize(gfx::PluginWindowHandle window, |
| 13 const gfx::Size& size, | 13 const gfx::Size& size, |
| 14 GPUProcessor* parent, | 14 GPUProcessor* parent, |
| 15 uint32 parent_texture_id) { | 15 uint32 parent_texture_id) { |
| 16 // Cannot reinitialize. | 16 // Cannot reinitialize. |
| 17 if (context_.get()) | 17 if (context_.get()) |
| 18 return false; | 18 return false; |
| 19 | 19 |
| 20 // Get the parent decoder and the GLContext to share IDs with, if any. | 20 // Get the parent decoder and the GLContext to share IDs with, if any. |
| 21 gles2::GLES2Decoder* parent_decoder = NULL; | 21 gles2::GLES2Decoder* parent_decoder = NULL; |
| 22 gfx::GLContext* parent_context = NULL; | 22 gfx::GLContext* parent_context = NULL; |
| 23 void* parent_handle = NULL; | |
| 24 if (parent) { | 23 if (parent) { |
| 25 parent_decoder = parent->decoder_.get(); | 24 parent_decoder = parent->decoder_.get(); |
| 26 DCHECK(parent_decoder); | 25 DCHECK(parent_decoder); |
| 27 | 26 |
| 28 parent_context = parent_decoder->GetGLContext(); | 27 parent_context = parent_decoder->GetGLContext(); |
| 29 DCHECK(parent_context); | 28 DCHECK(parent_context); |
| 30 | |
| 31 parent_handle = parent_context->GetHandle(); | |
| 32 DCHECK(parent_handle); | |
| 33 } | 29 } |
| 34 | 30 |
| 35 context_.reset(gfx::GLContext::CreateOffscreenGLContext(parent_handle)); | 31 context_.reset(gfx::GLContext::CreateOffscreenGLContext(parent_context)); |
| 36 if (!context_.get()) | 32 if (!context_.get()) |
| 37 return false; | 33 return false; |
| 38 | 34 |
| 39 // On Mac OS X since we can not render on-screen we don't even | 35 // On Mac OS X since we can not render on-screen we don't even |
| 40 // attempt to create a view based GLContext. The only difference | 36 // attempt to create a view based GLContext. The only difference |
| 41 // between "on-screen" and "off-screen" rendering on this platform | 37 // between "on-screen" and "off-screen" rendering on this platform |
| 42 // is whether we allocate an AcceleratedSurface, which transmits the | 38 // is whether we allocate an AcceleratedSurface, which transmits the |
| 43 // rendering results back to the browser. | 39 // rendering results back to the browser. |
| 44 if (window) { | 40 if (window) { |
| 45 #if !defined(UNIT_TEST) | |
| 46 surface_.reset(new AcceleratedSurface()); | 41 surface_.reset(new AcceleratedSurface()); |
| 47 // TODO(apatrick): AcceleratedSurface will not work with an OSMesa context. | 42 // TODO(apatrick): AcceleratedSurface will not work with an OSMesa context. |
| 48 if (!surface_->Initialize( | 43 if (!surface_->Initialize( |
| 49 static_cast<CGLContextObj>(context_->GetHandle()), false)) { | 44 static_cast<CGLContextObj>(context_->GetHandle()), false)) { |
| 50 Destroy(); | 45 Destroy(); |
| 51 return false; | 46 return false; |
| 52 } | 47 } |
| 53 #endif | |
| 54 } | 48 } |
| 55 | 49 |
| 56 return InitializeCommon(size, parent_decoder, parent_texture_id); | 50 return InitializeCommon(size, parent_decoder, parent_texture_id); |
| 57 | 51 |
| 58 return true; | 52 return true; |
| 59 } | 53 } |
| 60 | 54 |
| 61 void GPUProcessor::Destroy() { | 55 void GPUProcessor::Destroy() { |
| 62 #if !defined(UNIT_TEST) | |
| 63 if (surface_.get()) { | 56 if (surface_.get()) { |
| 64 surface_->Destroy(); | 57 surface_->Destroy(); |
| 65 } | 58 } |
| 66 surface_.reset(); | 59 surface_.reset(); |
| 67 #endif | |
| 68 DestroyCommon(); | 60 DestroyCommon(); |
| 69 } | 61 } |
| 70 | 62 |
| 71 uint64 GPUProcessor::SetWindowSizeForIOSurface(const gfx::Size& size) { | 63 uint64 GPUProcessor::SetWindowSizeForIOSurface(const gfx::Size& size) { |
| 72 #if !defined(UNIT_TEST) | |
| 73 ResizeOffscreenFrameBuffer(size); | 64 ResizeOffscreenFrameBuffer(size); |
| 74 decoder_->UpdateOffscreenFrameBufferSize(); | 65 decoder_->UpdateOffscreenFrameBufferSize(); |
| 75 return surface_->SetSurfaceSize(size); | 66 return surface_->SetSurfaceSize(size); |
| 76 #else | |
| 77 return 0; | |
| 78 #endif | |
| 79 } | 67 } |
| 80 | 68 |
| 81 TransportDIB::Handle GPUProcessor::SetWindowSizeForTransportDIB( | 69 TransportDIB::Handle GPUProcessor::SetWindowSizeForTransportDIB( |
| 82 const gfx::Size& size) { | 70 const gfx::Size& size) { |
| 83 #if !defined(UNIT_TEST) | |
| 84 ResizeOffscreenFrameBuffer(size); | 71 ResizeOffscreenFrameBuffer(size); |
| 85 decoder_->UpdateOffscreenFrameBufferSize(); | 72 decoder_->UpdateOffscreenFrameBufferSize(); |
| 86 return surface_->SetTransportDIBSize(size); | 73 return surface_->SetTransportDIBSize(size); |
| 87 #else | |
| 88 return TransportDIB::DefaultHandleValue(); | |
| 89 #endif | |
| 90 } | 74 } |
| 91 | 75 |
| 92 void GPUProcessor::SetTransportDIBAllocAndFree( | 76 void GPUProcessor::SetTransportDIBAllocAndFree( |
| 93 Callback2<size_t, TransportDIB::Handle*>::Type* allocator, | 77 Callback2<size_t, TransportDIB::Handle*>::Type* allocator, |
| 94 Callback1<TransportDIB::Id>::Type* deallocator) { | 78 Callback1<TransportDIB::Id>::Type* deallocator) { |
| 95 #if !defined(UNIT_TEST) | |
| 96 surface_->SetTransportDIBAllocAndFree(allocator, deallocator); | 79 surface_->SetTransportDIBAllocAndFree(allocator, deallocator); |
| 97 #endif | |
| 98 } | 80 } |
| 99 | 81 |
| 100 void GPUProcessor::WillSwapBuffers() { | 82 void GPUProcessor::WillSwapBuffers() { |
| 101 DCHECK(context_->IsCurrent()); | 83 DCHECK(context_->IsCurrent()); |
| 102 #if !defined(UNIT_TEST) | |
| 103 if (surface_.get()) { | 84 if (surface_.get()) { |
| 104 surface_->SwapBuffers(); | 85 surface_->SwapBuffers(); |
| 105 } | 86 } |
| 106 #endif | |
| 107 | 87 |
| 108 if (wrapped_swap_buffers_callback_.get()) { | 88 if (wrapped_swap_buffers_callback_.get()) { |
| 109 wrapped_swap_buffers_callback_->Run(); | 89 wrapped_swap_buffers_callback_->Run(); |
| 110 } | 90 } |
| 111 } | 91 } |
| 112 | 92 |
| 113 } // namespace gpu | 93 } // namespace gpu |
| 114 | 94 |
| OLD | NEW |