1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CC_RESOURCES_TEXTURE_MAILBOX_DELETER_H_ 6#define CC_RESOURCES_TEXTURE_MAILBOX_DELETER_H_ 7 8#include "base/memory/weak_ptr.h" 9#include "cc/base/cc_export.h" 10#include "cc/base/scoped_ptr_vector.h" 11 12namespace base { 13class SingleThreadTaskRunner; 14} 15 16namespace cc { 17class ContextProvider; 18class SingleReleaseCallback; 19 20class CC_EXPORT TextureMailboxDeleter { 21 public: 22 explicit TextureMailboxDeleter( 23 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner); 24 ~TextureMailboxDeleter(); 25 26 // Returns a Callback that can be used as the ReleaseCallback for a 27 // TextureMailbox attached to the |texture_id|. The ReleaseCallback can 28 // be passed to other threads and will destroy the texture, once it is 29 // run, on the impl thread. If the TextureMailboxDeleter is destroyed 30 // due to the compositor shutting down, then the ReleaseCallback will 31 // become a no-op and the texture will be deleted immediately on the 32 // impl thread, along with dropping the reference to the ContextProvider. 33 scoped_ptr<SingleReleaseCallback> GetReleaseCallback( 34 const scoped_refptr<ContextProvider>& context_provider, 35 unsigned texture_id); 36 37 private: 38 // Runs the |impl_callback| to delete the texture and removes the callback 39 // from the |impl_callbacks_| list. 40 void RunDeleteTextureOnImplThread(SingleReleaseCallback* impl_callback, 41 uint32 sync_point, 42 bool is_lost); 43 44 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner_; 45 ScopedPtrVector<SingleReleaseCallback> impl_callbacks_; 46 base::WeakPtrFactory<TextureMailboxDeleter> weak_ptr_factory_; 47}; 48 49} // namespace cc 50 51#endif // CC_RESOURCES_TEXTURE_MAILBOX_DELETER_H_ 52