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.
5 #ifndef GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_CACHE_H_
6 #define GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_CACHE_H_
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"
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.
23 // TODO(backer): Investigate using glReleaseShaderCompiler as an alternative to
25 class GPU_EXPORT ShaderTranslatorCache
26 : public base::RefCounted
<ShaderTranslatorCache
>,
27 public NON_EXPORTED_BASE(ShaderTranslator::DestructionObserver
) {
29 ShaderTranslatorCache();
31 // ShaderTranslator::DestructionObserver implementation
32 virtual void OnDestruct(ShaderTranslator
* translator
) OVERRIDE
;
34 scoped_refptr
<ShaderTranslator
> GetTranslator(
35 sh::GLenum shader_type
,
36 ShShaderSpec shader_spec
,
37 const ShBuiltInResources
* resources
,
38 ShaderTranslatorInterface::GlslImplementationType
39 glsl_implementation_type
,
40 ShCompileOptions driver_bug_workarounds
);
43 friend class base::RefCounted
<ShaderTranslatorCache
>;
44 virtual ~ShaderTranslatorCache();
46 // Parameters passed into ShaderTranslator::Init
47 struct ShaderTranslatorInitParams
{
48 sh::GLenum shader_type
;
49 ShShaderSpec shader_spec
;
50 ShBuiltInResources resources
;
51 ShaderTranslatorInterface::GlslImplementationType
52 glsl_implementation_type
;
53 ShCompileOptions driver_bug_workarounds
;
55 ShaderTranslatorInitParams(
56 sh::GLenum 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
),
65 glsl_implementation_type(glsl_implementation_type
),
66 driver_bug_workarounds(driver_bug_workarounds
) {
69 ShaderTranslatorInitParams(const ShaderTranslatorInitParams
& params
) {
70 memcpy(this, ¶ms
, sizeof(*this));
73 bool operator== (const ShaderTranslatorInitParams
& params
) const {
74 return memcmp(¶ms
, this, sizeof(*this)) == 0;
77 bool operator< (const ShaderTranslatorInitParams
& params
) const {
78 return memcmp(¶ms
, this, sizeof(*this)) < 0;
82 typedef std::map
<ShaderTranslatorInitParams
, ShaderTranslator
* > Cache
;
85 DISALLOW_COPY_AND_ASSIGN(ShaderTranslatorCache
);
91 #endif // GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_CACHE_H_