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