Index: content/common/gpu/client/context_provider_command_buffer.cc |
diff --git a/content/common/gpu/client/context_provider_command_buffer.cc b/content/common/gpu/client/context_provider_command_buffer.cc |
index 96e75ad926be90ee9b0a4c3ed90d361541d5f35a..338ab4331b5cde55ee9b2f08797ce4941ce1d0e4 100644 |
--- a/content/common/gpu/client/context_provider_command_buffer.cc |
+++ b/content/common/gpu/client/context_provider_command_buffer.cc |
@@ -5,7 +5,9 @@ |
#include "content/common/gpu/client/context_provider_command_buffer.h" |
#include "base/callback_helpers.h" |
+#include "cc/output/managed_memory_policy.h" |
#include "webkit/common/gpu/grcontext_for_webgraphicscontext3d.h" |
+#include "webkit/common/gpu/managed_memory_policy_convert.h" |
namespace content { |
@@ -29,6 +31,28 @@ class ContextProviderCommandBuffer::LostContextCallbackProxy |
ContextProviderCommandBuffer* provider_; |
}; |
+class ContextProviderCommandBuffer::SwapBuffersCompleteCallbackProxy |
+ : public WebKit::WebGraphicsContext3D:: |
+ WebGraphicsSwapBuffersCompleteCallbackCHROMIUM { |
+ public: |
+ explicit SwapBuffersCompleteCallbackProxy( |
+ ContextProviderCommandBuffer* provider) |
+ : provider_(provider) { |
+ provider_->context3d_->setSwapBuffersCompleteCallbackCHROMIUM(this); |
+ } |
+ |
+ virtual ~SwapBuffersCompleteCallbackProxy() { |
+ provider_->context3d_->setSwapBuffersCompleteCallbackCHROMIUM(NULL); |
+ } |
+ |
+ virtual void onSwapBuffersComplete() { |
+ provider_->OnSwapBuffersComplete(); |
+ } |
+ |
+ private: |
+ ContextProviderCommandBuffer* provider_; |
+}; |
+ |
class ContextProviderCommandBuffer::MemoryAllocationCallbackProxy |
: public WebKit::WebGraphicsContext3D:: |
WebGraphicsMemoryAllocationChangedCallbackCHROMIUM { |
@@ -43,8 +67,8 @@ class ContextProviderCommandBuffer::MemoryAllocationCallbackProxy |
} |
virtual void onMemoryAllocationChanged( |
- WebKit::WebGraphicsMemoryAllocation alloc) { |
- provider_->OnMemoryAllocationChanged(!!alloc.gpuResourceSizeInBytes); |
+ WebKit::WebGraphicsMemoryAllocation allocation) { |
+ provider_->OnMemoryAllocationChanged(allocation); |
} |
private: |
@@ -103,6 +127,10 @@ bool ContextProviderCommandBuffer::BindToCurrentThread() { |
return false; |
lost_context_callback_proxy_.reset(new LostContextCallbackProxy(this)); |
+ swap_buffers_complete_callback_proxy_.reset( |
+ new SwapBuffersCompleteCallbackProxy(this)); |
+ memory_allocation_callback_proxy_.reset( |
+ new MemoryAllocationCallbackProxy(this)); |
return true; |
} |
@@ -125,8 +153,6 @@ class GrContext* ContextProviderCommandBuffer::GrContext() { |
gr_context_.reset( |
new webkit::gpu::GrContextForWebGraphicsContext3D(context3d_.get())); |
- memory_allocation_callback_proxy_.reset( |
- new MemoryAllocationCallbackProxy(this)); |
return gr_context_->get(); |
} |
@@ -151,6 +177,34 @@ void ContextProviderCommandBuffer::OnLostContext() { |
base::ResetAndReturn(&lost_context_callback_).Run(); |
} |
+void ContextProviderCommandBuffer::OnSwapBuffersComplete() { |
+ DCHECK(context_thread_checker_.CalledOnValidThread()); |
+ if (!swap_buffers_complete_callback_.is_null()) |
+ swap_buffers_complete_callback_.Run(); |
+} |
+ |
+void ContextProviderCommandBuffer::OnMemoryAllocationChanged( |
+ const WebKit::WebGraphicsMemoryAllocation& allocation) { |
+ DCHECK(context_thread_checker_.CalledOnValidThread()); |
+ |
+ if (gr_context_) { |
+ bool nonzero_allocation = !!allocation.gpuResourceSizeInBytes; |
+ gr_context_->SetMemoryLimit(nonzero_allocation); |
+ } |
+ |
+ if (memory_policy_changed_callback_.is_null()) |
+ return; |
+ |
+ bool discard_backbuffer_when_not_visible; |
+ cc::ManagedMemoryPolicy policy = |
+ webkit::gpu::ManagedMemoryPolicyConvert::Convert( |
+ allocation, |
+ &discard_backbuffer_when_not_visible); |
+ |
+ memory_policy_changed_callback_.Run( |
+ policy, discard_backbuffer_when_not_visible); |
+} |
+ |
bool ContextProviderCommandBuffer::DestroyedOnMainThread() { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |
@@ -161,15 +215,25 @@ bool ContextProviderCommandBuffer::DestroyedOnMainThread() { |
void ContextProviderCommandBuffer::SetLostContextCallback( |
const LostContextCallback& lost_context_callback) { |
DCHECK(context_thread_checker_.CalledOnValidThread()); |
- DCHECK(lost_context_callback_.is_null()); |
+ DCHECK(lost_context_callback_.is_null() || |
+ lost_context_callback.is_null()); |
lost_context_callback_ = lost_context_callback; |
} |
-void ContextProviderCommandBuffer::OnMemoryAllocationChanged( |
- bool nonzero_allocation) { |
+void ContextProviderCommandBuffer::SetSwapBuffersCompleteCallback( |
+ const SwapBuffersCompleteCallback& swap_buffers_complete_callback) { |
DCHECK(context_thread_checker_.CalledOnValidThread()); |
- if (gr_context_) |
- gr_context_->SetMemoryLimit(nonzero_allocation); |
+ DCHECK(swap_buffers_complete_callback_.is_null() || |
+ swap_buffers_complete_callback.is_null()); |
+ swap_buffers_complete_callback_ = swap_buffers_complete_callback; |
+} |
+ |
+void ContextProviderCommandBuffer::SetMemoryPolicyChangedCallback( |
+ const MemoryPolicyChangedCallback& memory_policy_changed_callback) { |
+ DCHECK(context_thread_checker_.CalledOnValidThread()); |
+ DCHECK(memory_policy_changed_callback_.is_null() || |
+ memory_policy_changed_callback.is_null()); |
+ memory_policy_changed_callback_ = memory_policy_changed_callback; |
} |
} // namespace content |