gfx/angle/src/libGLESv2/renderer/ShaderCache.h

Sat, 03 Jan 2015 20:18:00 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Sat, 03 Jan 2015 20:18:00 +0100
branch
TOR_BUG_3246
changeset 7
129ffea94266
permissions
-rw-r--r--

Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.

     1 //
     2 // Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
     3 // Use of this source code is governed by a BSD-style license that can be
     4 // found in the LICENSE file.
     5 //
     7 // ShaderCache: Defines rx::ShaderCache, a cache of Direct3D shader objects
     8 // keyed by their byte code.
    10 #ifndef LIBGLESV2_RENDERER_SHADER_CACHE_H_
    11 #define LIBGLESV2_RENDERER_SHADER_CACHE_H_
    13 #include "common/debug.h"
    15 namespace rx
    16 {
    17 template <typename ShaderObject>
    18 class ShaderCache
    19 {
    20   public:
    21     ShaderCache() : mDevice(NULL)
    22     {
    23     }
    25     ~ShaderCache()
    26     {
    27         // Call clear while the device is still valid.
    28         ASSERT(mMap.empty());
    29     }
    31     void initialize(IDirect3DDevice9* device)
    32     {
    33         mDevice = device;
    34     }
    36     ShaderObject *create(const DWORD *function, size_t length)
    37     {
    38         std::string key(reinterpret_cast<const char*>(function), length);
    39         typename Map::iterator it = mMap.find(key);
    40         if (it != mMap.end())
    41         {
    42             it->second->AddRef();
    43             return it->second;
    44         }
    46         ShaderObject *shader;
    47         HRESULT result = createShader(function, &shader);
    48         if (FAILED(result))
    49         {
    50             return NULL;
    51         }
    53         // Random eviction policy.
    54         if (mMap.size() >= kMaxMapSize)
    55         {
    56             mMap.begin()->second->Release();
    57             mMap.erase(mMap.begin());
    58         }
    60         shader->AddRef();
    61         mMap[key] = shader;
    63         return shader;
    64     }
    66     void clear()
    67     {
    68         for (typename Map::iterator it = mMap.begin(); it != mMap.end(); ++it)
    69         {
    70             it->second->Release();
    71         }
    73         mMap.clear();
    74     }
    76   private:
    77     DISALLOW_COPY_AND_ASSIGN(ShaderCache);
    79     const static size_t kMaxMapSize = 100;
    81     HRESULT createShader(const DWORD *function, IDirect3DVertexShader9 **shader)
    82     {
    83         return mDevice->CreateVertexShader(function, shader);
    84     }
    86     HRESULT createShader(const DWORD *function, IDirect3DPixelShader9 **shader)
    87     {
    88         return mDevice->CreatePixelShader(function, shader);
    89     }
    91 #ifndef HASH_MAP
    92 # ifdef _MSC_VER
    93 #  define HASH_MAP stdext::hash_map
    94 # else
    95 #  define HASH_MAP std::unordered_map
    96 # endif
    97 #endif
    99     typedef HASH_MAP<std::string, ShaderObject*> Map;
   100     Map mMap;
   102     IDirect3DDevice9 *mDevice;
   103 };
   105 typedef ShaderCache<IDirect3DVertexShader9> VertexShaderCache;
   106 typedef ShaderCache<IDirect3DPixelShader9> PixelShaderCache;
   108 }
   110 #endif   // LIBGLESV2_RENDERER_SHADER_CACHE_H_

mercurial