| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "webkit/common/gpu/context_provider_in_process.h" | 5 #include "webkit/common/gpu/context_provider_in_process.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback_helpers.h" | 8 #include "base/callback_helpers.h" |
| 9 #include "cc/output/managed_memory_policy.h" |
| 9 #include "webkit/common/gpu/grcontext_for_webgraphicscontext3d.h" | 10 #include "webkit/common/gpu/grcontext_for_webgraphicscontext3d.h" |
| 10 #include "webkit/common/gpu/webgraphicscontext3d_in_process_command_buffer_impl.
h" | 11 #include "webkit/common/gpu/managed_memory_policy_convert.h" |
| 11 | 12 |
| 12 namespace webkit { | 13 namespace webkit { |
| 13 namespace gpu { | 14 namespace gpu { |
| 14 | 15 |
| 15 class ContextProviderInProcess::LostContextCallbackProxy | 16 class ContextProviderInProcess::LostContextCallbackProxy |
| 16 : public WebKit::WebGraphicsContext3D::WebGraphicsContextLostCallback { | 17 : public WebKit::WebGraphicsContext3D::WebGraphicsContextLostCallback { |
| 17 public: | 18 public: |
| 18 explicit LostContextCallbackProxy(ContextProviderInProcess* provider) | 19 explicit LostContextCallbackProxy(ContextProviderInProcess* provider) |
| 19 : provider_(provider) { | 20 : provider_(provider) { |
| 20 provider_->context3d_->setContextLostCallback(this); | 21 provider_->context3d_->setContextLostCallback(this); |
| 21 } | 22 } |
| 22 | 23 |
| 23 virtual ~LostContextCallbackProxy() { | 24 virtual ~LostContextCallbackProxy() { |
| 24 provider_->context3d_->setContextLostCallback(NULL); | 25 provider_->context3d_->setContextLostCallback(NULL); |
| 25 } | 26 } |
| 26 | 27 |
| 27 virtual void onContextLost() { | 28 virtual void onContextLost() { |
| 28 provider_->OnLostContext(); | 29 provider_->OnLostContext(); |
| 29 } | 30 } |
| 30 | 31 |
| 31 private: | 32 private: |
| 32 ContextProviderInProcess* provider_; | 33 ContextProviderInProcess* provider_; |
| 33 }; | 34 }; |
| 34 | 35 |
| 36 class ContextProviderInProcess::SwapBuffersCompleteCallbackProxy |
| 37 : public WebKit::WebGraphicsContext3D:: |
| 38 WebGraphicsSwapBuffersCompleteCallbackCHROMIUM { |
| 39 public: |
| 40 explicit SwapBuffersCompleteCallbackProxy(ContextProviderInProcess* provider) |
| 41 : provider_(provider) { |
| 42 provider_->context3d_->setSwapBuffersCompleteCallbackCHROMIUM(this); |
| 43 } |
| 44 |
| 45 virtual ~SwapBuffersCompleteCallbackProxy() { |
| 46 provider_->context3d_->setSwapBuffersCompleteCallbackCHROMIUM(NULL); |
| 47 } |
| 48 |
| 49 virtual void onSwapBuffersComplete() { |
| 50 provider_->OnSwapBuffersComplete(); |
| 51 } |
| 52 |
| 53 private: |
| 54 ContextProviderInProcess* provider_; |
| 55 }; |
| 56 |
| 35 class ContextProviderInProcess::MemoryAllocationCallbackProxy | 57 class ContextProviderInProcess::MemoryAllocationCallbackProxy |
| 36 : public WebKit::WebGraphicsContext3D:: | 58 : public WebKit::WebGraphicsContext3D:: |
| 37 WebGraphicsMemoryAllocationChangedCallbackCHROMIUM { | 59 WebGraphicsMemoryAllocationChangedCallbackCHROMIUM { |
| 38 public: | 60 public: |
| 39 explicit MemoryAllocationCallbackProxy(ContextProviderInProcess* provider) | 61 explicit MemoryAllocationCallbackProxy(ContextProviderInProcess* provider) |
| 40 : provider_(provider) { | 62 : provider_(provider) { |
| 41 provider_->context3d_->setMemoryAllocationChangedCallbackCHROMIUM(this); | 63 provider_->context3d_->setMemoryAllocationChangedCallbackCHROMIUM(this); |
| 42 } | 64 } |
| 43 | 65 |
| 44 virtual ~MemoryAllocationCallbackProxy() { | 66 virtual ~MemoryAllocationCallbackProxy() { |
| 45 provider_->context3d_->setMemoryAllocationChangedCallbackCHROMIUM(NULL); | 67 provider_->context3d_->setMemoryAllocationChangedCallbackCHROMIUM(NULL); |
| 46 } | 68 } |
| 47 | 69 |
| 48 virtual void onMemoryAllocationChanged( | 70 virtual void onMemoryAllocationChanged( |
| 49 WebKit::WebGraphicsMemoryAllocation alloc) { | 71 WebKit::WebGraphicsMemoryAllocation allocation) { |
| 50 provider_->OnMemoryAllocationChanged(!!alloc.gpuResourceSizeInBytes); | 72 provider_->OnMemoryAllocationChanged(allocation); |
| 51 } | 73 } |
| 52 | 74 |
| 53 private: | 75 private: |
| 54 ContextProviderInProcess* provider_; | 76 ContextProviderInProcess* provider_; |
| 55 }; | 77 }; |
| 56 | 78 |
| 57 // static | 79 // static |
| 58 scoped_refptr<ContextProviderInProcess> ContextProviderInProcess::Create( | 80 scoped_refptr<ContextProviderInProcess> ContextProviderInProcess::Create( |
| 59 const CreateCallback& create_callback) { | 81 const CreateCallback& create_callback) { |
| 60 scoped_refptr<ContextProviderInProcess> provider = | 82 scoped_refptr<ContextProviderInProcess> provider = |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 110 // This is called on the thread the context will be used. | 132 // This is called on the thread the context will be used. |
| 111 DCHECK(context_thread_checker_.CalledOnValidThread()); | 133 DCHECK(context_thread_checker_.CalledOnValidThread()); |
| 112 | 134 |
| 113 if (lost_context_callback_proxy_) | 135 if (lost_context_callback_proxy_) |
| 114 return true; | 136 return true; |
| 115 | 137 |
| 116 if (!context3d_->makeContextCurrent()) | 138 if (!context3d_->makeContextCurrent()) |
| 117 return false; | 139 return false; |
| 118 | 140 |
| 119 lost_context_callback_proxy_.reset(new LostContextCallbackProxy(this)); | 141 lost_context_callback_proxy_.reset(new LostContextCallbackProxy(this)); |
| 142 swap_buffers_complete_callback_proxy_.reset( |
| 143 new SwapBuffersCompleteCallbackProxy(this)); |
| 144 memory_allocation_callback_proxy_.reset( |
| 145 new MemoryAllocationCallbackProxy(this)); |
| 120 return true; | 146 return true; |
| 121 } | 147 } |
| 122 | 148 |
| 123 WebKit::WebGraphicsContext3D* ContextProviderInProcess::Context3d() { | 149 webkit::gpu::WebGraphicsContext3DInProcessCommandBufferImpl* |
| 150 ContextProviderInProcess::Context3d() { |
| 124 DCHECK(context3d_); | 151 DCHECK(context3d_); |
| 125 DCHECK(lost_context_callback_proxy_); // Is bound to thread. | 152 DCHECK(lost_context_callback_proxy_); // Is bound to thread. |
| 126 DCHECK(context_thread_checker_.CalledOnValidThread()); | 153 DCHECK(context_thread_checker_.CalledOnValidThread()); |
| 127 | 154 |
| 128 return context3d_.get(); | 155 return context3d_.get(); |
| 129 } | 156 } |
| 130 | 157 |
| 131 class GrContext* ContextProviderInProcess::GrContext() { | 158 class GrContext* ContextProviderInProcess::GrContext() { |
| 132 DCHECK(context3d_); | 159 DCHECK(context3d_); |
| 133 DCHECK(lost_context_callback_proxy_); // Is bound to thread. | 160 DCHECK(lost_context_callback_proxy_); // Is bound to thread. |
| 134 DCHECK(context_thread_checker_.CalledOnValidThread()); | 161 DCHECK(context_thread_checker_.CalledOnValidThread()); |
| 135 | 162 |
| 136 if (gr_context_) | 163 if (gr_context_) |
| 137 return gr_context_->get(); | 164 return gr_context_->get(); |
| 138 | 165 |
| 139 gr_context_.reset( | 166 gr_context_.reset( |
| 140 new webkit::gpu::GrContextForWebGraphicsContext3D(context3d_.get())); | 167 new webkit::gpu::GrContextForWebGraphicsContext3D(context3d_.get())); |
| 141 memory_allocation_callback_proxy_.reset( | |
| 142 new MemoryAllocationCallbackProxy(this)); | |
| 143 return gr_context_->get(); | 168 return gr_context_->get(); |
| 144 } | 169 } |
| 145 | 170 |
| 146 void ContextProviderInProcess::VerifyContexts() { | 171 void ContextProviderInProcess::VerifyContexts() { |
| 147 DCHECK(context3d_); | 172 DCHECK(context3d_); |
| 148 DCHECK(lost_context_callback_proxy_); // Is bound to thread. | 173 DCHECK(lost_context_callback_proxy_); // Is bound to thread. |
| 149 DCHECK(context_thread_checker_.CalledOnValidThread()); | 174 DCHECK(context_thread_checker_.CalledOnValidThread()); |
| 150 | 175 |
| 151 if (context3d_->isContextLost()) | 176 if (context3d_->isContextLost()) |
| 152 OnLostContext(); | 177 OnLostContext(); |
| 153 } | 178 } |
| 154 | 179 |
| 155 void ContextProviderInProcess::OnLostContext() { | 180 void ContextProviderInProcess::OnLostContext() { |
| 156 DCHECK(context_thread_checker_.CalledOnValidThread()); | 181 DCHECK(context_thread_checker_.CalledOnValidThread()); |
| 157 { | 182 { |
| 158 base::AutoLock lock(destroyed_lock_); | 183 base::AutoLock lock(destroyed_lock_); |
| 159 if (destroyed_) | 184 if (destroyed_) |
| 160 return; | 185 return; |
| 161 destroyed_ = true; | 186 destroyed_ = true; |
| 162 } | 187 } |
| 163 if (!lost_context_callback_.is_null()) | 188 if (!lost_context_callback_.is_null()) |
| 164 base::ResetAndReturn(&lost_context_callback_).Run(); | 189 base::ResetAndReturn(&lost_context_callback_).Run(); |
| 165 } | 190 } |
| 166 | 191 |
| 192 void ContextProviderInProcess::OnSwapBuffersComplete() { |
| 193 DCHECK(context_thread_checker_.CalledOnValidThread()); |
| 194 if (!swap_buffers_complete_callback_.is_null()) |
| 195 swap_buffers_complete_callback_.Run(); |
| 196 } |
| 197 |
| 198 void ContextProviderInProcess::OnMemoryAllocationChanged( |
| 199 const WebKit::WebGraphicsMemoryAllocation& allocation) { |
| 200 DCHECK(context_thread_checker_.CalledOnValidThread()); |
| 201 |
| 202 if (gr_context_) { |
| 203 bool nonzero_allocation = !!allocation.gpuResourceSizeInBytes; |
| 204 gr_context_->SetMemoryLimit(nonzero_allocation); |
| 205 } |
| 206 |
| 207 if (memory_policy_changed_callback_.is_null()) |
| 208 return; |
| 209 |
| 210 bool discard_backbuffer_when_not_visible; |
| 211 cc::ManagedMemoryPolicy policy = |
| 212 ManagedMemoryPolicyConvert::Convert(allocation, |
| 213 &discard_backbuffer_when_not_visible); |
| 214 |
| 215 memory_policy_changed_callback_.Run( |
| 216 policy, discard_backbuffer_when_not_visible); |
| 217 } |
| 218 |
| 167 bool ContextProviderInProcess::DestroyedOnMainThread() { | 219 bool ContextProviderInProcess::DestroyedOnMainThread() { |
| 168 DCHECK(main_thread_checker_.CalledOnValidThread()); | 220 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 169 | 221 |
| 170 base::AutoLock lock(destroyed_lock_); | 222 base::AutoLock lock(destroyed_lock_); |
| 171 return destroyed_; | 223 return destroyed_; |
| 172 } | 224 } |
| 173 | 225 |
| 174 void ContextProviderInProcess::SetLostContextCallback( | 226 void ContextProviderInProcess::SetLostContextCallback( |
| 175 const LostContextCallback& lost_context_callback) { | 227 const LostContextCallback& lost_context_callback) { |
| 176 DCHECK(context_thread_checker_.CalledOnValidThread()); | 228 DCHECK(context_thread_checker_.CalledOnValidThread()); |
| 177 DCHECK(lost_context_callback_.is_null()); | 229 DCHECK(lost_context_callback_.is_null() || |
| 230 lost_context_callback.is_null()); |
| 178 lost_context_callback_ = lost_context_callback; | 231 lost_context_callback_ = lost_context_callback; |
| 179 } | 232 } |
| 180 | 233 |
| 181 void ContextProviderInProcess::OnMemoryAllocationChanged( | 234 void ContextProviderInProcess::SetSwapBuffersCompleteCallback( |
| 182 bool nonzero_allocation) { | 235 const SwapBuffersCompleteCallback& swap_buffers_complete_callback) { |
| 183 DCHECK(context_thread_checker_.CalledOnValidThread()); | 236 DCHECK(context_thread_checker_.CalledOnValidThread()); |
| 184 if (gr_context_) | 237 DCHECK(swap_buffers_complete_callback_.is_null() || |
| 185 gr_context_->SetMemoryLimit(nonzero_allocation); | 238 swap_buffers_complete_callback.is_null()); |
| 239 swap_buffers_complete_callback_ = swap_buffers_complete_callback; |
| 240 } |
| 241 |
| 242 void ContextProviderInProcess::SetMemoryPolicyChangedCallback( |
| 243 const MemoryPolicyChangedCallback& memory_policy_changed_callback) { |
| 244 DCHECK(context_thread_checker_.CalledOnValidThread()); |
| 245 DCHECK(memory_policy_changed_callback_.is_null() || |
| 246 memory_policy_changed_callback.is_null()); |
| 247 memory_policy_changed_callback_ = memory_policy_changed_callback; |
| 186 } | 248 } |
| 187 | 249 |
| 188 } // namespace gpu | 250 } // namespace gpu |
| 189 } // namespace webkit | 251 } // namespace webkit |
| OLD | NEW |