| 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 |