Home | History | Annotate | Download | only in gpu
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef CONTENT_BROWSER_GPU_SHADER_DISK_CACHE_H_
      6 #define CONTENT_BROWSER_GPU_SHADER_DISK_CACHE_H_
      7 
      8 #include <map>
      9 #include <queue>
     10 #include <string>
     11 
     12 #include "base/files/file_path.h"
     13 #include "base/memory/ref_counted.h"
     14 #include "base/memory/singleton.h"
     15 #include "content/common/content_export.h"
     16 #include "net/disk_cache/disk_cache.h"
     17 
     18 namespace content {
     19 
     20 class ShaderDiskCacheEntry;
     21 class ShaderDiskReadHelper;
     22 class ShaderClearHelper;
     23 
     24 // ShaderDiskCache is the interface to the on disk cache for
     25 // GL shaders.
     26 //
     27 // While this class is both RefCounted and SupportsWeakPtr
     28 // when using this class you should work with the RefCounting.
     29 // The WeakPtr is needed interally.
     30 class CONTENT_EXPORT ShaderDiskCache
     31     : public base::RefCounted<ShaderDiskCache>,
     32       public base::SupportsWeakPtr<ShaderDiskCache> {
     33  public:
     34   void Init();
     35 
     36   void set_host_id(int host_id) { host_id_ = host_id; }
     37 
     38   // Store the |shader| into the cache under |key|.
     39   void Cache(const std::string& key, const std::string& shader);
     40 
     41   // Clear a range of entries. This supports unbounded deletes in either
     42   // direction by using null Time values for either |begin_time| or |end_time|.
     43   // The return value is a net error code. If this method returns
     44   // ERR_IO_PENDING, the |completion_callback| will be invoked when the
     45   // operation completes.
     46   int Clear(
     47       const base::Time begin_time,
     48       const base::Time end_time,
     49       const net::CompletionCallback& completion_callback);
     50 
     51   // Sets a callback for when the cache is available. If the cache is
     52   // already available the callback will not be called and net::OK is returned.
     53   // If the callback is set net::ERR_IO_PENDING is returned and the callback
     54   // will be executed when the cache is available.
     55   int SetAvailableCallback(const net::CompletionCallback& callback);
     56 
     57   // Returns the number of elements currently in the cache.
     58   int32 Size();
     59 
     60   // Set a callback notification for when all current entries have been
     61   // written to the cache.
     62   // The return value is a net error code. If this method returns
     63   // ERR_IO_PENDING, the |callback| will be invoked when all entries have
     64   // been written to the cache.
     65   int SetCacheCompleteCallback(const net::CompletionCallback& callback);
     66 
     67  private:
     68   friend class base::RefCounted<ShaderDiskCache>;
     69   friend class ShaderDiskCacheEntry;
     70   friend class ShaderDiskReadHelper;
     71   friend class ShaderCacheFactory;
     72 
     73   explicit ShaderDiskCache(const base::FilePath& cache_path);
     74   ~ShaderDiskCache();
     75 
     76   void CacheCreatedCallback(int rv);
     77 
     78   disk_cache::Backend* backend() { return backend_.get(); }
     79 
     80   void EntryComplete(void* entry);
     81   void ReadComplete();
     82 
     83   bool cache_available_;
     84   int host_id_;
     85   base::FilePath cache_path_;
     86   bool is_initialized_;
     87   net::CompletionCallback available_callback_;
     88   net::CompletionCallback cache_complete_callback_;
     89 
     90   scoped_ptr<disk_cache::Backend> backend_;
     91 
     92   scoped_refptr<ShaderDiskReadHelper> helper_;
     93   std::map<void*, scoped_refptr<ShaderDiskCacheEntry> > entry_map_;
     94 
     95   DISALLOW_COPY_AND_ASSIGN(ShaderDiskCache);
     96 };
     97 
     98 // ShaderCacheFactory maintains a cache of ShaderDiskCache objects
     99 // so we only create one per profile directory.
    100 class CONTENT_EXPORT ShaderCacheFactory {
    101  public:
    102   static ShaderCacheFactory* GetInstance();
    103 
    104   // Clear the shader disk cache for the given |path|. This supports unbounded
    105   // deletes in either direction by using null Time values for either
    106   // |begin_time| or |end_time|. The |callback| will be executed when the
    107   // clear is complete.
    108   void ClearByPath(const base::FilePath& path,
    109                    const base::Time& begin_time,
    110                    const base::Time& end_time,
    111                    const base::Closure& callback);
    112 
    113   // Retrieve the shader disk cache for the provided |client_id|.
    114   scoped_refptr<ShaderDiskCache> Get(int32 client_id);
    115 
    116   // Set the |path| to be used for the disk cache for |client_id|.
    117   void SetCacheInfo(int32 client_id, const base::FilePath& path);
    118 
    119   // Remove the path mapping for |client_id|.
    120   void RemoveCacheInfo(int32 client_id);
    121 
    122   // Set the provided |cache| into the cache map for the given |path|.
    123   void AddToCache(const base::FilePath& path, ShaderDiskCache* cache);
    124 
    125   // Remove the provided |path| from our cache map.
    126   void RemoveFromCache(const base::FilePath& path);
    127 
    128  private:
    129   friend struct DefaultSingletonTraits<ShaderCacheFactory>;
    130   friend class ShaderClearHelper;
    131 
    132   ShaderCacheFactory();
    133   ~ShaderCacheFactory();
    134 
    135   scoped_refptr<ShaderDiskCache> GetByPath(const base::FilePath& path);
    136   void CacheCleared(const base::FilePath& path);
    137 
    138   typedef std::map<base::FilePath, ShaderDiskCache*> ShaderCacheMap;
    139   ShaderCacheMap shader_cache_map_;
    140 
    141   typedef std::map<int32, base::FilePath> ClientIdToPathMap;
    142   ClientIdToPathMap client_id_to_path_map_;
    143 
    144   typedef std::queue<scoped_refptr<ShaderClearHelper> > ShaderClearQueue;
    145   typedef std::map<base::FilePath, ShaderClearQueue> ShaderClearMap;
    146   ShaderClearMap shader_clear_map_;
    147 
    148   DISALLOW_COPY_AND_ASSIGN(ShaderCacheFactory);
    149 };
    150 
    151 }  // namespace content
    152 
    153 #endif  // CONTENT_BROWSER_GPU_SHADER_DISK_CACHE_H_
    154 
    155