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/logging.h" | 11 #include "base/logging.h" |
12 | 12 |
13 namespace { | 13 namespace { |
14 | 14 |
15 using gpu::gles2::ShaderTranslator; | 15 using gpu::gles2::ShaderTranslator; |
16 | 16 |
17 void FinalizeShaderTranslator(void* /* dummy */) { | 17 void FinalizeShaderTranslator(void* /* dummy */) { |
18 ShFinalize(); | 18 ShFinalize(); |
19 } | 19 } |
20 | 20 |
21 bool InitializeShaderTranslator() { | 21 bool InitializeShaderTranslator() { |
22 static bool initialized = false; | 22 static bool initialized = false; |
23 if (!initialized && ShInitialize()) { | 23 if (!initialized && ShInitialize()) { |
24 base::AtExitManager::RegisterCallback(&FinalizeShaderTranslator, NULL); | 24 base::AtExitManager::RegisterCallback(&FinalizeShaderTranslator, NULL); |
25 initialized = true; | 25 initialized = true; |
26 } | 26 } |
27 return initialized; | 27 return initialized; |
28 } | 28 } |
29 | 29 |
| 30 #if !defined(ANGLE_SH_VERSION) || ANGLE_SH_VERSION < 108 |
| 31 typedef int ANGLEGetInfoType; |
| 32 #else |
| 33 typedef size_t ANGLEGetInfoType; |
| 34 #endif |
| 35 |
30 void GetVariableInfo(ShHandle compiler, ShShaderInfo var_type, | 36 void GetVariableInfo(ShHandle compiler, ShShaderInfo var_type, |
31 ShaderTranslator::VariableMap* var_map) { | 37 ShaderTranslator::VariableMap* var_map) { |
32 int name_len = 0, mapped_name_len = 0; | 38 ANGLEGetInfoType name_len = 0, mapped_name_len = 0; |
33 switch (var_type) { | 39 switch (var_type) { |
34 case SH_ACTIVE_ATTRIBUTES: | 40 case SH_ACTIVE_ATTRIBUTES: |
35 ShGetInfo(compiler, SH_ACTIVE_ATTRIBUTE_MAX_LENGTH, &name_len); | 41 ShGetInfo(compiler, SH_ACTIVE_ATTRIBUTE_MAX_LENGTH, &name_len); |
36 break; | 42 break; |
37 case SH_ACTIVE_UNIFORMS: | 43 case SH_ACTIVE_UNIFORMS: |
38 ShGetInfo(compiler, SH_ACTIVE_UNIFORM_MAX_LENGTH, &name_len); | 44 ShGetInfo(compiler, SH_ACTIVE_UNIFORM_MAX_LENGTH, &name_len); |
39 break; | 45 break; |
40 default: NOTREACHED(); | 46 default: NOTREACHED(); |
41 } | 47 } |
42 ShGetInfo(compiler, SH_MAPPED_NAME_MAX_LENGTH, &mapped_name_len); | 48 ShGetInfo(compiler, SH_MAPPED_NAME_MAX_LENGTH, &mapped_name_len); |
43 if (name_len <= 1 || mapped_name_len <= 1) return; | 49 if (name_len <= 1 || mapped_name_len <= 1) return; |
44 scoped_array<char> name(new char[name_len]); | 50 scoped_array<char> name(new char[name_len]); |
45 scoped_array<char> mapped_name(new char[mapped_name_len]); | 51 scoped_array<char> mapped_name(new char[mapped_name_len]); |
46 | 52 |
47 int num_vars = 0; | 53 ANGLEGetInfoType num_vars = 0; |
48 ShGetInfo(compiler, var_type, &num_vars); | 54 ShGetInfo(compiler, var_type, &num_vars); |
49 for (int i = 0; i < num_vars; ++i) { | 55 for (ANGLEGetInfoType i = 0; i < num_vars; ++i) { |
50 int len = 0; | 56 ANGLEGetInfoType len = 0; |
51 int size = 0; | 57 int size = 0; |
52 ShDataType type = SH_NONE; | 58 ShDataType type = SH_NONE; |
53 | 59 |
54 switch (var_type) { | 60 switch (var_type) { |
55 case SH_ACTIVE_ATTRIBUTES: | 61 case SH_ACTIVE_ATTRIBUTES: |
56 ShGetActiveAttrib( | 62 ShGetActiveAttrib( |
57 compiler, i, &len, &size, &type, name.get(), mapped_name.get()); | 63 compiler, i, &len, &size, &type, name.get(), mapped_name.get()); |
58 break; | 64 break; |
59 case SH_ACTIVE_UNIFORMS: | 65 case SH_ACTIVE_UNIFORMS: |
60 ShGetActiveUniform( | 66 ShGetActiveUniform( |
61 compiler, i, &len, &size, &type, name.get(), mapped_name.get()); | 67 compiler, i, &len, &size, &type, name.get(), mapped_name.get()); |
62 break; | 68 break; |
63 default: NOTREACHED(); | 69 default: NOTREACHED(); |
64 } | 70 } |
65 | 71 |
66 // In theory we should CHECK(len <= name_len - 1) here, but ANGLE needs | 72 // In theory we should CHECK(len <= name_len - 1) here, but ANGLE needs |
67 // to handle long struct field name mapping before we can do this. | 73 // to handle long struct field name mapping before we can do this. |
68 // Also, we should modify the ANGLE interface to also return a length | 74 // Also, we should modify the ANGLE interface to also return a length |
69 // for mapped_name. | 75 // for mapped_name. |
70 std::string name_string(name.get(), std::min(len, name_len - 1)); | 76 std::string name_string(name.get(), std::min(len, name_len - 1)); |
71 mapped_name.get()[mapped_name_len - 1] = '\0'; | 77 mapped_name.get()[mapped_name_len - 1] = '\0'; |
72 | 78 |
73 ShaderTranslator::VariableInfo info(type, size, name_string); | 79 ShaderTranslator::VariableInfo info(type, size, name_string); |
74 (*var_map)[mapped_name.get()] = info; | 80 (*var_map)[mapped_name.get()] = info; |
75 } | 81 } |
76 } | 82 } |
77 | 83 |
78 void GetNameHashingInfo( | 84 void GetNameHashingInfo( |
79 ShHandle compiler, ShaderTranslator::NameMap* name_map) { | 85 ShHandle compiler, ShaderTranslator::NameMap* name_map) { |
80 int hashed_names_count = 0; | 86 ANGLEGetInfoType hashed_names_count = 0; |
81 ShGetInfo(compiler, SH_HASHED_NAMES_COUNT, &hashed_names_count); | 87 ShGetInfo(compiler, SH_HASHED_NAMES_COUNT, &hashed_names_count); |
82 if (hashed_names_count == 0) | 88 if (hashed_names_count == 0) |
83 return; | 89 return; |
84 | 90 |
85 int name_max_len = 0, hashed_name_max_len = 0; | 91 ANGLEGetInfoType name_max_len = 0, hashed_name_max_len = 0; |
86 ShGetInfo(compiler, SH_NAME_MAX_LENGTH, &name_max_len); | 92 ShGetInfo(compiler, SH_NAME_MAX_LENGTH, &name_max_len); |
87 ShGetInfo(compiler, SH_HASHED_NAME_MAX_LENGTH, &hashed_name_max_len); | 93 ShGetInfo(compiler, SH_HASHED_NAME_MAX_LENGTH, &hashed_name_max_len); |
88 | 94 |
89 scoped_array<char> name(new char[name_max_len]); | 95 scoped_array<char> name(new char[name_max_len]); |
90 scoped_array<char> hashed_name(new char[hashed_name_max_len]); | 96 scoped_array<char> hashed_name(new char[hashed_name_max_len]); |
91 | 97 |
92 for (int i = 0; i < hashed_names_count; ++i) { | 98 for (ANGLEGetInfoType i = 0; i < hashed_names_count; ++i) { |
93 ShGetNameHashingEntry(compiler, i, name.get(), hashed_name.get()); | 99 ShGetNameHashingEntry(compiler, i, name.get(), hashed_name.get()); |
94 (*name_map)[hashed_name.get()] = name.get(); | 100 (*name_map)[hashed_name.get()] = name.get(); |
95 } | 101 } |
96 } | 102 } |
97 | 103 |
98 } // namespace | 104 } // namespace |
99 | 105 |
100 namespace gpu { | 106 namespace gpu { |
101 namespace gles2 { | 107 namespace gles2 { |
102 | 108 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 SH_OBJECT_CODE | SH_ATTRIBUTES_UNIFORMS | | 156 SH_OBJECT_CODE | SH_ATTRIBUTES_UNIFORMS | |
151 SH_MAP_LONG_VARIABLE_NAMES | SH_ENFORCE_PACKING_RESTRICTIONS; | 157 SH_MAP_LONG_VARIABLE_NAMES | SH_ENFORCE_PACKING_RESTRICTIONS; |
152 | 158 |
153 compile_options |= SH_CLAMP_INDIRECT_ARRAY_BOUNDS; | 159 compile_options |= SH_CLAMP_INDIRECT_ARRAY_BOUNDS; |
154 | 160 |
155 if (needs_built_in_function_emulation_) | 161 if (needs_built_in_function_emulation_) |
156 compile_options |= SH_EMULATE_BUILT_IN_FUNCTIONS; | 162 compile_options |= SH_EMULATE_BUILT_IN_FUNCTIONS; |
157 if (ShCompile(compiler_, &shader, 1, compile_options)) { | 163 if (ShCompile(compiler_, &shader, 1, compile_options)) { |
158 success = true; | 164 success = true; |
159 // Get translated shader. | 165 // Get translated shader. |
160 int obj_code_len = 0; | 166 ANGLEGetInfoType obj_code_len = 0; |
161 ShGetInfo(compiler_, SH_OBJECT_CODE_LENGTH, &obj_code_len); | 167 ShGetInfo(compiler_, SH_OBJECT_CODE_LENGTH, &obj_code_len); |
162 if (obj_code_len > 1) { | 168 if (obj_code_len > 1) { |
163 translated_shader_.reset(new char[obj_code_len]); | 169 translated_shader_.reset(new char[obj_code_len]); |
164 ShGetObjectCode(compiler_, translated_shader_.get()); | 170 ShGetObjectCode(compiler_, translated_shader_.get()); |
165 } | 171 } |
166 // Get info for attribs and uniforms. | 172 // Get info for attribs and uniforms. |
167 GetVariableInfo(compiler_, SH_ACTIVE_ATTRIBUTES, &attrib_map_); | 173 GetVariableInfo(compiler_, SH_ACTIVE_ATTRIBUTES, &attrib_map_); |
168 GetVariableInfo(compiler_, SH_ACTIVE_UNIFORMS, &uniform_map_); | 174 GetVariableInfo(compiler_, SH_ACTIVE_UNIFORMS, &uniform_map_); |
169 // Get info for name hashing. | 175 // Get info for name hashing. |
170 GetNameHashingInfo(compiler_, &name_map_); | 176 GetNameHashingInfo(compiler_, &name_map_); |
171 } | 177 } |
172 | 178 |
173 // Get info log. | 179 // Get info log. |
174 int info_log_len = 0; | 180 ANGLEGetInfoType info_log_len = 0; |
175 ShGetInfo(compiler_, SH_INFO_LOG_LENGTH, &info_log_len); | 181 ShGetInfo(compiler_, SH_INFO_LOG_LENGTH, &info_log_len); |
176 if (info_log_len > 1) { | 182 if (info_log_len > 1) { |
177 info_log_.reset(new char[info_log_len]); | 183 info_log_.reset(new char[info_log_len]); |
178 ShGetInfoLog(compiler_, info_log_.get()); | 184 ShGetInfoLog(compiler_, info_log_.get()); |
179 } else { | 185 } else { |
180 info_log_.reset(); | 186 info_log_.reset(); |
181 } | 187 } |
182 | 188 |
183 return success; | 189 return success; |
184 } | 190 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 translated_shader_.reset(); | 235 translated_shader_.reset(); |
230 info_log_.reset(); | 236 info_log_.reset(); |
231 attrib_map_.clear(); | 237 attrib_map_.clear(); |
232 uniform_map_.clear(); | 238 uniform_map_.clear(); |
233 name_map_.clear(); | 239 name_map_.clear(); |
234 } | 240 } |
235 | 241 |
236 } // namespace gles2 | 242 } // namespace gles2 |
237 } // namespace gpu | 243 } // namespace gpu |
238 | 244 |
OLD | NEW |