shader_translator_cache.h revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
1// Copyright (c) 2012 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_SHADER_TRANSLATOR_CACHE_H_
6#define GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_CACHE_H_
7
8#include <string.h>
9
10#include <map>
11
12#include "base/memory/ref_counted.h"
13#include "gpu/command_buffer/service/shader_translator.h"
14#include "third_party/angle/include/GLSLANG/ShaderLang.h"
15
16namespace gpu {
17namespace gles2 {
18
19// This class is not thread safe and can only be created and destroyed
20// on a single thread. But it is safe to use two independent instances on two
21// threads without synchronization.
22//
23// TODO(backer): Investigate using glReleaseShaderCompiler as an alternative to
24// to this cache.
25class GPU_EXPORT ShaderTranslatorCache
26    : public base::RefCounted<ShaderTranslatorCache>,
27      public NON_EXPORTED_BASE(ShaderTranslator::DestructionObserver) {
28 public:
29  ShaderTranslatorCache();
30
31  // ShaderTranslator::DestructionObserver implementation
32  virtual void OnDestruct(ShaderTranslator* translator) OVERRIDE;
33
34  scoped_refptr<ShaderTranslator> GetTranslator(
35      ShShaderType shader_type,
36      ShShaderSpec shader_spec,
37      const ShBuiltInResources* resources,
38      ShaderTranslatorInterface::GlslImplementationType
39          glsl_implementation_type,
40      ShCompileOptions driver_bug_workarounds);
41
42 private:
43  friend class base::RefCounted<ShaderTranslatorCache>;
44  virtual ~ShaderTranslatorCache();
45
46  // Parameters passed into ShaderTranslator::Init
47  struct ShaderTranslatorInitParams {
48    ShShaderType shader_type;
49    ShShaderSpec shader_spec;
50    ShBuiltInResources resources;
51    ShaderTranslatorInterface::GlslImplementationType
52        glsl_implementation_type;
53    ShCompileOptions driver_bug_workarounds;
54
55    ShaderTranslatorInitParams(
56        ShShaderType shader_type,
57        ShShaderSpec shader_spec,
58        const ShBuiltInResources& resources,
59        ShaderTranslatorInterface::GlslImplementationType
60            glsl_implementation_type,
61        ShCompileOptions driver_bug_workarounds)
62      : shader_type(shader_type),
63        shader_spec(shader_spec),
64        resources(resources),
65        glsl_implementation_type(glsl_implementation_type),
66        driver_bug_workarounds(driver_bug_workarounds) {
67    }
68
69    ShaderTranslatorInitParams(const ShaderTranslatorInitParams& params) {
70      memcpy(this, &params, sizeof(*this));
71    }
72
73    bool operator== (const ShaderTranslatorInitParams& params) const {
74      return memcmp(&params, this, sizeof(*this)) == 0;
75    }
76
77    bool operator< (const ShaderTranslatorInitParams& params) const {
78      return memcmp(&params, this, sizeof(*this)) < 0;
79    }
80  };
81
82  typedef std::map<ShaderTranslatorInitParams, ShaderTranslator* > Cache;
83  Cache cache_;
84
85  DISALLOW_COPY_AND_ASSIGN(ShaderTranslatorCache);
86};
87
88}  // namespace gles2
89}  // namespace gpu
90
91#endif  // GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_CACHE_H_
92