shader_translator_cache.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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#include <GLES2/gl2.h>
6
7#include "gpu/command_buffer/service/shader_translator_cache.h"
8
9namespace gpu {
10namespace gles2 {
11
12ShaderTranslatorCache::ShaderTranslatorCache() {
13}
14
15ShaderTranslatorCache::~ShaderTranslatorCache() {
16  DCHECK(cache_.empty());
17}
18
19void ShaderTranslatorCache::OnDestruct(ShaderTranslator* translator) {
20  Cache::iterator it = cache_.begin();
21  while (it != cache_.end()) {
22    if (it->second == translator) {
23      cache_.erase(it);
24      return;
25    }
26    it++;
27  }
28}
29
30scoped_refptr<ShaderTranslator> ShaderTranslatorCache::GetTranslator(
31#if (ANGLE_SH_VERSION >= 126)
32    sh::GLenum shader_type,
33#else
34    ShShaderType shader_type,
35#endif
36    ShShaderSpec shader_spec,
37    const ShBuiltInResources* resources,
38    ShaderTranslatorInterface::GlslImplementationType
39        glsl_implementation_type,
40    ShCompileOptions driver_bug_workarounds) {
41  ShaderTranslatorInitParams params(shader_type,
42                                    shader_spec,
43                                    *resources,
44                                    glsl_implementation_type,
45                                    driver_bug_workarounds);
46
47  Cache::iterator it = cache_.find(params);
48  if (it != cache_.end())
49    return it->second;
50
51  ShaderTranslator* translator = new ShaderTranslator();
52  if (translator->Init(shader_type, shader_spec, resources,
53                       glsl_implementation_type,
54                       driver_bug_workarounds)) {
55    cache_[params] = translator;
56    translator->AddDestructionObserver(this);
57    return translator;
58  } else {
59    return NULL;
60  }
61}
62
63}  // namespace gles2
64}  // namespace gpu
65