1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
gpu / command_buffer / service / shader_translator_cache.cc [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "gpu/command_buffer/service/shader_translator_cache.h"
namespace gpu {
namespace gles2 {
ShaderTranslatorCache::ShaderTranslatorCache(
const GpuPreferences& gpu_preferences)
: gpu_preferences_(gpu_preferences) {
}
ShaderTranslatorCache::~ShaderTranslatorCache() {
DCHECK(cache_.empty());
}
void ShaderTranslatorCache::OnDestruct(ShaderTranslator* translator) {
Cache::iterator it = cache_.begin();
while (it != cache_.end()) {
if (it->second == translator) {
cache_.erase(it);
return;
}
it++;
}
}
scoped_refptr<ShaderTranslator> ShaderTranslatorCache::GetTranslator(
sh::GLenum shader_type,
ShShaderSpec shader_spec,
const ShBuiltInResources* resources,
ShShaderOutput shader_output_language,
const ShCompileOptions& driver_bug_workarounds) {
ShaderTranslatorInitParams params(shader_type, shader_spec, *resources,
shader_output_language,
driver_bug_workarounds);
Cache::iterator it = cache_.find(params);
if (it != cache_.end())
return it->second.get();
ShaderTranslator* translator = new ShaderTranslator();
if (translator->Init(shader_type, shader_spec, resources,
shader_output_language, driver_bug_workarounds,
gpu_preferences_.gl_shader_interm_output)) {
cache_[params] = translator;
translator->AddDestructionObserver(this);
return translator;
} else {
return nullptr;
}
}
} // namespace gles2
} // namespace gpu