OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gpu/command_buffer/service/shader_translator.h" | 5 #include "gpu/command_buffer/service/shader_translator.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 #include <algorithm> | 8 #include <algorithm> |
9 | 9 |
10 #include "base/at_exit.h" | 10 #include "base/at_exit.h" |
11 #include "base/debug/trace_event.h" | 11 #include "base/debug/trace_event.h" |
| 12 #include "base/lazy_instance.h" |
12 #include "base/logging.h" | 13 #include "base/logging.h" |
13 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
14 | 15 |
15 namespace { | 16 namespace { |
16 | 17 |
17 using gpu::gles2::ShaderTranslator; | 18 using gpu::gles2::ShaderTranslator; |
18 | 19 |
19 bool g_translator_initialized = false; | 20 class ShaderTranslatorInitializer { |
20 | 21 public: |
21 void FinalizeShaderTranslator(void* /* dummy */) { | 22 ShaderTranslatorInitializer() { |
22 TRACE_EVENT0("gpu", "ShFinalize"); | |
23 ShFinalize(); | |
24 g_translator_initialized = false; | |
25 } | |
26 | |
27 bool InitializeShaderTranslator() { | |
28 if (!g_translator_initialized) { | |
29 TRACE_EVENT0("gpu", "ShInitialize"); | 23 TRACE_EVENT0("gpu", "ShInitialize"); |
30 CHECK(ShInitialize()); | 24 CHECK(ShInitialize()); |
31 base::AtExitManager::RegisterCallback(&FinalizeShaderTranslator, NULL); | |
32 g_translator_initialized = true; | |
33 } | 25 } |
34 return g_translator_initialized; | 26 |
35 } | 27 ~ShaderTranslatorInitializer() { |
| 28 TRACE_EVENT0("gpu", "ShFinalize"); |
| 29 ShFinalize(); |
| 30 } |
| 31 }; |
| 32 |
| 33 base::LazyInstance<ShaderTranslatorInitializer> g_translator_initializer = |
| 34 LAZY_INSTANCE_INITIALIZER; |
36 | 35 |
37 #if !defined(ANGLE_SH_VERSION) || ANGLE_SH_VERSION < 108 | 36 #if !defined(ANGLE_SH_VERSION) || ANGLE_SH_VERSION < 108 |
38 typedef int ANGLEGetInfoType; | 37 typedef int ANGLEGetInfoType; |
39 #else | 38 #else |
40 typedef size_t ANGLEGetInfoType; | 39 typedef size_t ANGLEGetInfoType; |
41 #endif | 40 #endif |
42 | 41 |
43 void GetVariableInfo(ShHandle compiler, ShShaderInfo var_type, | 42 void GetVariableInfo(ShHandle compiler, ShShaderInfo var_type, |
44 ShaderTranslator::VariableMap* var_map) { | 43 ShaderTranslator::VariableMap* var_map) { |
45 ANGLEGetInfoType name_len = 0, mapped_name_len = 0; | 44 ANGLEGetInfoType name_len = 0, mapped_name_len = 0; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 ShShaderSpec shader_spec, | 127 ShShaderSpec shader_spec, |
129 const ShBuiltInResources* resources, | 128 const ShBuiltInResources* resources, |
130 ShaderTranslatorInterface::GlslImplementationType glsl_implementation_type, | 129 ShaderTranslatorInterface::GlslImplementationType glsl_implementation_type, |
131 ShCompileOptions driver_bug_workarounds) { | 130 ShCompileOptions driver_bug_workarounds) { |
132 // Make sure Init is called only once. | 131 // Make sure Init is called only once. |
133 DCHECK(compiler_ == NULL); | 132 DCHECK(compiler_ == NULL); |
134 DCHECK(shader_type == SH_FRAGMENT_SHADER || shader_type == SH_VERTEX_SHADER); | 133 DCHECK(shader_type == SH_FRAGMENT_SHADER || shader_type == SH_VERTEX_SHADER); |
135 DCHECK(shader_spec == SH_GLES2_SPEC || shader_spec == SH_WEBGL_SPEC); | 134 DCHECK(shader_spec == SH_GLES2_SPEC || shader_spec == SH_WEBGL_SPEC); |
136 DCHECK(resources != NULL); | 135 DCHECK(resources != NULL); |
137 | 136 |
138 if (!InitializeShaderTranslator()) | 137 g_translator_initializer.Get(); |
139 return false; | |
140 | 138 |
141 ShShaderOutput shader_output = | 139 ShShaderOutput shader_output = |
142 (glsl_implementation_type == kGlslES ? SH_ESSL_OUTPUT : SH_GLSL_OUTPUT); | 140 (glsl_implementation_type == kGlslES ? SH_ESSL_OUTPUT : SH_GLSL_OUTPUT); |
143 | 141 |
144 { | 142 { |
145 TRACE_EVENT0("gpu", "ShConstructCompiler"); | 143 TRACE_EVENT0("gpu", "ShConstructCompiler"); |
146 compiler_ = ShConstructCompiler( | 144 compiler_ = ShConstructCompiler( |
147 shader_type, shader_spec, shader_output, resources); | 145 shader_type, shader_spec, shader_output, resources); |
148 } | 146 } |
149 compiler_options_ = *resources; | 147 compiler_options_ = *resources; |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 info_log_.reset(); | 326 info_log_.reset(); |
329 attrib_map_.clear(); | 327 attrib_map_.clear(); |
330 uniform_map_.clear(); | 328 uniform_map_.clear(); |
331 varying_map_.clear(); | 329 varying_map_.clear(); |
332 name_map_.clear(); | 330 name_map_.clear(); |
333 } | 331 } |
334 | 332 |
335 } // namespace gles2 | 333 } // namespace gles2 |
336 } // namespace gpu | 334 } // namespace gpu |
337 | 335 |
OLD | NEW |