Home | History | Annotate | Download | only in service
      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 GPU_COMMAND_BUFFER_SERVICE_ASYNC_PIXEL_TRANSFER_MANAGER_H_
      6 #define GPU_COMMAND_BUFFER_SERVICE_ASYNC_PIXEL_TRANSFER_MANAGER_H_
      7 
      8 #include <set>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/callback.h"
     12 #include "base/containers/hash_tables.h"
     13 #include "base/memory/linked_ptr.h"
     14 #include "base/memory/ref_counted.h"
     15 #include "gpu/command_buffer/service/texture_manager.h"
     16 #include "gpu/gpu_export.h"
     17 
     18 #if defined(COMPILER_GCC)
     19 namespace BASE_HASH_NAMESPACE {
     20 template <>
     21   struct hash<gpu::gles2::TextureRef*> {
     22   size_t operator()(gpu::gles2::TextureRef* ptr) const {
     23     return hash<size_t>()(reinterpret_cast<size_t>(ptr));
     24   }
     25 };
     26 }  // namespace BASE_HASH_NAMESPACE
     27 #endif  // COMPILER
     28 
     29 namespace gfx {
     30 class GLContext;
     31 }
     32 
     33 namespace gpu {
     34 class AsyncPixelTransferDelegate;
     35 class AsyncMemoryParams;
     36 struct AsyncTexImage2DParams;
     37 
     38 class AsyncPixelTransferCompletionObserver
     39     : public base::RefCountedThreadSafe<AsyncPixelTransferCompletionObserver> {
     40  public:
     41   AsyncPixelTransferCompletionObserver();
     42 
     43   virtual void DidComplete(const AsyncMemoryParams& mem_params) = 0;
     44 
     45  protected:
     46   virtual ~AsyncPixelTransferCompletionObserver();
     47 
     48  private:
     49   friend class base::RefCountedThreadSafe<AsyncPixelTransferCompletionObserver>;
     50 
     51   DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferCompletionObserver);
     52 };
     53 
     54 class GPU_EXPORT AsyncPixelTransferManager
     55     : public gles2::TextureManager::DestructionObserver {
     56  public:
     57   static AsyncPixelTransferManager* Create(gfx::GLContext* context);
     58 
     59   virtual ~AsyncPixelTransferManager();
     60 
     61   void Initialize(gles2::TextureManager* texture_manager);
     62 
     63   virtual void BindCompletedAsyncTransfers() = 0;
     64 
     65   // There's no guarantee that callback will run on the caller thread.
     66   virtual void AsyncNotifyCompletion(
     67       const AsyncMemoryParams& mem_params,
     68       AsyncPixelTransferCompletionObserver* observer) = 0;
     69 
     70   virtual uint32 GetTextureUploadCount() = 0;
     71   virtual base::TimeDelta GetTotalTextureUploadTime() = 0;
     72 
     73   // ProcessMorePendingTransfers() will be called at a good time
     74   // to process a small amount of pending transfer work while
     75   // NeedsProcessMorePendingTransfers() returns true. Implementations
     76   // that can't dispatch work to separate threads should use
     77   // this to avoid blocking the caller thread inappropriately.
     78   virtual void ProcessMorePendingTransfers() = 0;
     79   virtual bool NeedsProcessMorePendingTransfers() = 0;
     80 
     81   // Wait for all AsyncTex(Sub)Image2D uploads to finish before returning.
     82   virtual void WaitAllAsyncTexImage2D() = 0;
     83 
     84   AsyncPixelTransferDelegate* CreatePixelTransferDelegate(
     85       gles2::TextureRef* ref,
     86       const AsyncTexImage2DParams& define_params);
     87 
     88   AsyncPixelTransferDelegate* GetPixelTransferDelegate(
     89       gles2::TextureRef* ref);
     90 
     91   void ClearPixelTransferDelegateForTest(gles2::TextureRef* ref);
     92 
     93   bool AsyncTransferIsInProgress(gles2::TextureRef* ref);
     94 
     95   // gles2::TextureRef::DestructionObserver implementation:
     96   virtual void OnTextureManagerDestroying(gles2::TextureManager* manager)
     97       OVERRIDE;
     98   virtual void OnTextureRefDestroying(gles2::TextureRef* texture) OVERRIDE;
     99 
    100  protected:
    101   AsyncPixelTransferManager();
    102 
    103  private:
    104   gles2::TextureManager* manager_;
    105 
    106   typedef base::hash_map<gles2::TextureRef*,
    107                          linked_ptr<AsyncPixelTransferDelegate> >
    108       TextureToDelegateMap;
    109   TextureToDelegateMap delegate_map_;
    110 
    111   // A factory method called by CreatePixelTransferDelegate that is overriden
    112   // by each implementation.
    113   virtual AsyncPixelTransferDelegate* CreatePixelTransferDelegateImpl(
    114       gles2::TextureRef* ref,
    115       const AsyncTexImage2DParams& define_params) = 0;
    116 
    117   DISALLOW_COPY_AND_ASSIGN(AsyncPixelTransferManager);
    118 };
    119 
    120 }  // namespace gpu
    121 
    122 #endif  // GPU_COMMAND_BUFFER_SERVICE_ASYNC_PIXEL_TRANSFER_MANAGER_H_
    123