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/program_manager.h" | 5 #include "gpu/command_buffer/service/program_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 return output + input.as_string(); | 175 return output + input.as_string(); |
176 } | 176 } |
177 | 177 |
178 void Program::UpdateLogInfo() { | 178 void Program::UpdateLogInfo() { |
179 GLint max_len = 0; | 179 GLint max_len = 0; |
180 glGetProgramiv(service_id_, GL_INFO_LOG_LENGTH, &max_len); | 180 glGetProgramiv(service_id_, GL_INFO_LOG_LENGTH, &max_len); |
181 if (max_len == 0) { | 181 if (max_len == 0) { |
182 set_log_info(NULL); | 182 set_log_info(NULL); |
183 return; | 183 return; |
184 } | 184 } |
185 scoped_array<char> temp(new char[max_len]); | 185 scoped_ptr<char[]> temp(new char[max_len]); |
186 GLint len = 0; | 186 GLint len = 0; |
187 glGetProgramInfoLog(service_id_, max_len, &len, temp.get()); | 187 glGetProgramInfoLog(service_id_, max_len, &len, temp.get()); |
188 DCHECK(max_len == 0 || len < max_len); | 188 DCHECK(max_len == 0 || len < max_len); |
189 DCHECK(len == 0 || temp[len] == '\0'); | 189 DCHECK(len == 0 || temp[len] == '\0'); |
190 std::string log(temp.get(), len); | 190 std::string log(temp.get(), len); |
191 set_log_info(ProcessLogInfo(log).c_str()); | 191 set_log_info(ProcessLogInfo(log).c_str()); |
192 } | 192 } |
193 | 193 |
194 void Program::ClearUniforms( | 194 void Program::ClearUniforms( |
195 std::vector<uint8>* zero_buffer) { | 195 std::vector<uint8>* zero_buffer) { |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 Reset(); | 291 Reset(); |
292 UpdateLogInfo(); | 292 UpdateLogInfo(); |
293 link_status_ = true; | 293 link_status_ = true; |
294 uniforms_cleared_ = false; | 294 uniforms_cleared_ = false; |
295 GLint num_attribs = 0; | 295 GLint num_attribs = 0; |
296 GLint max_len = 0; | 296 GLint max_len = 0; |
297 GLint max_location = -1; | 297 GLint max_location = -1; |
298 glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTES, &num_attribs); | 298 glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTES, &num_attribs); |
299 glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_len); | 299 glGetProgramiv(service_id_, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &max_len); |
300 // TODO(gman): Should we check for error? | 300 // TODO(gman): Should we check for error? |
301 scoped_array<char> name_buffer(new char[max_len]); | 301 scoped_ptr<char[]> name_buffer(new char[max_len]); |
302 for (GLint ii = 0; ii < num_attribs; ++ii) { | 302 for (GLint ii = 0; ii < num_attribs; ++ii) { |
303 GLsizei length = 0; | 303 GLsizei length = 0; |
304 GLsizei size = 0; | 304 GLsizei size = 0; |
305 GLenum type = 0; | 305 GLenum type = 0; |
306 glGetActiveAttrib( | 306 glGetActiveAttrib( |
307 service_id_, ii, max_len, &length, &size, &type, name_buffer.get()); | 307 service_id_, ii, max_len, &length, &size, &type, name_buffer.get()); |
308 DCHECK(max_len == 0 || length < max_len); | 308 DCHECK(max_len == 0 || length < max_len); |
309 DCHECK(length == 0 || name_buffer[length] == '\0'); | 309 DCHECK(length == 0 || name_buffer[length] == '\0'); |
310 if (!ProgramManager::IsInvalidPrefix(name_buffer.get(), length)) { | 310 if (!ProgramManager::IsInvalidPrefix(name_buffer.get(), length)) { |
311 std::string name; | 311 std::string name; |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
486 shader->UpdateTranslatedSource(shader_src); | 486 shader->UpdateTranslatedSource(shader_src); |
487 } | 487 } |
488 | 488 |
489 glShaderSource(shader->service_id(), 1, &shader_src, NULL); | 489 glShaderSource(shader->service_id(), 1, &shader_src, NULL); |
490 glCompileShader(shader->service_id()); | 490 glCompileShader(shader->service_id()); |
491 if (feature_info->feature_flags().angle_translated_shader_source) { | 491 if (feature_info->feature_flags().angle_translated_shader_source) { |
492 GLint max_len = 0; | 492 GLint max_len = 0; |
493 glGetShaderiv(shader->service_id(), | 493 glGetShaderiv(shader->service_id(), |
494 GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, | 494 GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, |
495 &max_len); | 495 &max_len); |
496 scoped_array<char> temp(new char[max_len]); | 496 scoped_ptr<char[]> temp(new char[max_len]); |
497 GLint len = 0; | 497 GLint len = 0; |
498 glGetTranslatedShaderSourceANGLE( | 498 glGetTranslatedShaderSourceANGLE( |
499 shader->service_id(), max_len, &len, temp.get()); | 499 shader->service_id(), max_len, &len, temp.get()); |
500 DCHECK(max_len == 0 || len < max_len); | 500 DCHECK(max_len == 0 || len < max_len); |
501 DCHECK(len == 0 || temp[len] == '\0'); | 501 DCHECK(len == 0 || temp[len] == '\0'); |
502 shader->UpdateTranslatedSource(max_len ? temp.get() : NULL); | 502 shader->UpdateTranslatedSource(max_len ? temp.get() : NULL); |
503 } | 503 } |
504 | 504 |
505 GLint status = GL_FALSE; | 505 GLint status = GL_FALSE; |
506 glGetShaderiv(shader->service_id(), GL_COMPILE_STATUS, &status); | 506 glGetShaderiv(shader->service_id(), GL_COMPILE_STATUS, &status); |
507 if (status) { | 507 if (status) { |
508 shader->SetStatus(true, "", translator); | 508 shader->SetStatus(true, "", translator); |
509 if (program_cache_) { | 509 if (program_cache_) { |
510 const char* untranslated_source = source ? source->c_str() : ""; | 510 const char* untranslated_source = source ? source->c_str() : ""; |
511 program_cache_->ShaderCompilationSucceeded(untranslated_source); | 511 program_cache_->ShaderCompilationSucceeded(untranslated_source); |
512 } | 512 } |
513 } else { | 513 } else { |
514 // We cannot reach here if we are using the shader translator. | 514 // We cannot reach here if we are using the shader translator. |
515 // All invalid shaders must be rejected by the translator. | 515 // All invalid shaders must be rejected by the translator. |
516 // All translated shaders must compile. | 516 // All translated shaders must compile. |
517 GLint max_len = 0; | 517 GLint max_len = 0; |
518 glGetShaderiv(shader->service_id(), GL_INFO_LOG_LENGTH, &max_len); | 518 glGetShaderiv(shader->service_id(), GL_INFO_LOG_LENGTH, &max_len); |
519 scoped_array<char> temp(new char[max_len]); | 519 scoped_ptr<char[]> temp(new char[max_len]); |
520 GLint len = 0; | 520 GLint len = 0; |
521 glGetShaderInfoLog(shader->service_id(), max_len, &len, temp.get()); | 521 glGetShaderInfoLog(shader->service_id(), max_len, &len, temp.get()); |
522 DCHECK(max_len == 0 || len < max_len); | 522 DCHECK(max_len == 0 || len < max_len); |
523 DCHECK(len == 0 || temp[len] == '\0'); | 523 DCHECK(len == 0 || temp[len] == '\0'); |
524 shader->SetStatus(false, std::string(temp.get(), len).c_str(), NULL); | 524 shader->SetStatus(false, std::string(temp.get(), len).c_str(), NULL); |
525 LOG_IF(ERROR, translator) | 525 LOG_IF(ERROR, translator) |
526 << "Shader translator allowed/produced an invalid shader " | 526 << "Shader translator allowed/produced an invalid shader " |
527 << "unless the driver is buggy:" | 527 << "unless the driver is buggy:" |
528 << "\n--original-shader--\n" << (source ? *source : "") | 528 << "\n--original-shader--\n" << (source ? *source : "") |
529 << "\n--translated-shader--\n" << shader_src | 529 << "\n--translated-shader--\n" << shader_src |
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1222 program->ClearUniforms(&zero_); | 1222 program->ClearUniforms(&zero_); |
1223 } | 1223 } |
1224 } | 1224 } |
1225 | 1225 |
1226 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { | 1226 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { |
1227 return index + element * 0x10000; | 1227 return index + element * 0x10000; |
1228 } | 1228 } |
1229 | 1229 |
1230 } // namespace gles2 | 1230 } // namespace gles2 |
1231 } // namespace gpu | 1231 } // namespace gpu |
OLD | NEW |