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 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 friend class ShaderTranslatorCacheTest_InitParamComparable_Test
;
45 ~ShaderTranslatorCache() override
;
47 // Parameters passed into ShaderTranslator::Init
48 struct ShaderTranslatorInitParams
{
49 sh::GLenum shader_type
;
50 ShShaderSpec shader_spec
;
51 ShBuiltInResources resources
;
52 ShaderTranslatorInterface::GlslImplementationType
53 glsl_implementation_type
;
54 ShCompileOptions driver_bug_workarounds
;
56 ShaderTranslatorInitParams(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 memset(this, 0, sizeof(*this));
63 this->shader_type
= shader_type
;
64 this->shader_spec
= shader_spec
;
65 this->resources
= resources
;
66 this->glsl_implementation_type
= glsl_implementation_type
;
67 this->driver_bug_workarounds
= driver_bug_workarounds
;
70 ShaderTranslatorInitParams(const ShaderTranslatorInitParams
& params
) {
71 memcpy(this, ¶ms
, sizeof(*this));
74 bool operator== (const ShaderTranslatorInitParams
& params
) const {
75 return memcmp(¶ms
, this, sizeof(*this)) == 0;
78 bool operator< (const ShaderTranslatorInitParams
& params
) const {
79 return memcmp(¶ms
, this, sizeof(*this)) < 0;
83 ShaderTranslatorInitParams();
84 ShaderTranslatorInitParams
& operator=(const ShaderTranslatorInitParams
&);
87 typedef std::map
<ShaderTranslatorInitParams
, ShaderTranslator
* > Cache
;
90 DISALLOW_COPY_AND_ASSIGN(ShaderTranslatorCache
);
96 #endif // GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_CACHE_H_