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 #if (ANGLE_SH_VERSION >= 126)
36 sh::GLenum shader_type
,
38 ShShaderType shader_type
,
40 ShShaderSpec shader_spec
,
41 const ShBuiltInResources
* resources
,
42 ShaderTranslatorInterface::GlslImplementationType
43 glsl_implementation_type
,
44 ShCompileOptions driver_bug_workarounds
);
47 friend class base::RefCounted
<ShaderTranslatorCache
>;
48 virtual ~ShaderTranslatorCache();
50 // Parameters passed into ShaderTranslator::Init
51 struct ShaderTranslatorInitParams
{
52 #if (ANGLE_SH_VERSION >= 126)
53 sh::GLenum shader_type
;
55 ShShaderType shader_type
;
57 ShShaderSpec shader_spec
;
58 ShBuiltInResources resources
;
59 ShaderTranslatorInterface::GlslImplementationType
60 glsl_implementation_type
;
61 ShCompileOptions driver_bug_workarounds
;
63 ShaderTranslatorInitParams(
64 #if (ANGLE_SH_VERSION >= 126)
65 sh::GLenum shader_type
,
67 ShShaderType shader_type
,
69 ShShaderSpec shader_spec
,
70 const ShBuiltInResources
& resources
,
71 ShaderTranslatorInterface::GlslImplementationType
72 glsl_implementation_type
,
73 ShCompileOptions driver_bug_workarounds
)
74 : shader_type(shader_type
),
75 shader_spec(shader_spec
),
77 glsl_implementation_type(glsl_implementation_type
),
78 driver_bug_workarounds(driver_bug_workarounds
) {
81 ShaderTranslatorInitParams(const ShaderTranslatorInitParams
& params
) {
82 memcpy(this, ¶ms
, sizeof(*this));
85 bool operator== (const ShaderTranslatorInitParams
& params
) const {
86 return memcmp(¶ms
, this, sizeof(*this)) == 0;
89 bool operator< (const ShaderTranslatorInitParams
& params
) const {
90 return memcmp(¶ms
, this, sizeof(*this)) < 0;
94 typedef std::map
<ShaderTranslatorInitParams
, ShaderTranslator
* > Cache
;
97 DISALLOW_COPY_AND_ASSIGN(ShaderTranslatorCache
);
103 #endif // GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_CACHE_H_