| 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> |
| 11 | 11 |
| 12 #include "base/basictypes.h" | 12 #include "base/basictypes.h" |
| 13 #include "base/command_line.h" | 13 #include "base/command_line.h" |
| 14 #include "base/logging.h" | 14 #include "base/logging.h" |
| 15 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
| 16 #include "base/metrics/histogram.h" | 16 #include "base/metrics/histogram.h" |
| 17 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
| 18 #include "base/time/time.h" | 18 #include "base/time/time.h" |
| 19 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 19 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
| 20 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 20 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
| 21 #include "gpu/command_buffer/service/feature_info.h" |
| 21 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 22 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 22 #include "gpu/command_buffer/service/gpu_switches.h" | 23 #include "gpu/command_buffer/service/gpu_switches.h" |
| 23 #include "gpu/command_buffer/service/program_cache.h" | 24 #include "gpu/command_buffer/service/program_cache.h" |
| 24 #include "gpu/command_buffer/service/shader_manager.h" | 25 #include "gpu/command_buffer/service/shader_manager.h" |
| 25 #include "gpu/command_buffer/service/shader_translator.h" | 26 #include "gpu/command_buffer/service/shader_translator.h" |
| 26 #include "third_party/re2/re2/re2.h" | 27 #include "third_party/re2/re2/re2.h" |
| 27 | 28 |
| 28 using base::TimeDelta; | 29 using base::TimeDelta; |
| 29 using base::TimeTicks; | 30 using base::TimeTicks; |
| 30 | 31 |
| (...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 453 | 454 |
| 454 void Program::ExecuteBindAttribLocationCalls() { | 455 void Program::ExecuteBindAttribLocationCalls() { |
| 455 for (LocationMap::const_iterator it = bind_attrib_location_map_.begin(); | 456 for (LocationMap::const_iterator it = bind_attrib_location_map_.begin(); |
| 456 it != bind_attrib_location_map_.end(); ++it) { | 457 it != bind_attrib_location_map_.end(); ++it) { |
| 457 const std::string* mapped_name = GetAttribMappedName(it->first); | 458 const std::string* mapped_name = GetAttribMappedName(it->first); |
| 458 if (mapped_name && *mapped_name != it->first) | 459 if (mapped_name && *mapped_name != it->first) |
| 459 glBindAttribLocation(service_id_, it->second, mapped_name->c_str()); | 460 glBindAttribLocation(service_id_, it->second, mapped_name->c_str()); |
| 460 } | 461 } |
| 461 } | 462 } |
| 462 | 463 |
| 463 void ProgramManager::DoCompileShader( | 464 void ProgramManager::DoCompileShader(Shader* shader, |
| 464 Shader* shader, | 465 ShaderTranslator* translator, |
| 465 ShaderTranslator* translator, | 466 FeatureInfo* feature_info) { |
| 466 ProgramManager::TranslatedShaderSourceType translated_shader_source_type) { | |
| 467 // Translate GL ES 2.0 shader to Desktop GL shader and pass that to | 467 // Translate GL ES 2.0 shader to Desktop GL shader and pass that to |
| 468 // glShaderSource and then glCompileShader. | 468 // glShaderSource and then glCompileShader. |
| 469 const std::string* source = shader->source(); | 469 const std::string* source = shader->source(); |
| 470 const char* shader_src = source ? source->c_str() : ""; | 470 const char* shader_src = source ? source->c_str() : ""; |
| 471 if (translator) { | 471 if (translator) { |
| 472 if (!translator->Translate(shader_src)) { | 472 if (!translator->Translate(shader_src)) { |
| 473 shader->SetStatus(false, translator->info_log(), NULL); | 473 shader->SetStatus(false, translator->info_log(), NULL); |
| 474 return; | 474 return; |
| 475 } | 475 } |
| 476 shader_src = translator->translated_shader(); | 476 shader_src = translator->translated_shader(); |
| 477 if (translated_shader_source_type != kANGLE) | 477 if (!feature_info->feature_flags().angle_translated_shader_source) |
| 478 shader->UpdateTranslatedSource(shader_src); | 478 shader->UpdateTranslatedSource(shader_src); |
| 479 } | 479 } |
| 480 | 480 |
| 481 glShaderSource(shader->service_id(), 1, &shader_src, NULL); | 481 glShaderSource(shader->service_id(), 1, &shader_src, NULL); |
| 482 glCompileShader(shader->service_id()); | 482 glCompileShader(shader->service_id()); |
| 483 if (translated_shader_source_type == kANGLE) { | 483 if (feature_info->feature_flags().angle_translated_shader_source) { |
| 484 GLint max_len = 0; | 484 GLint max_len = 0; |
| 485 glGetShaderiv(shader->service_id(), | 485 glGetShaderiv(shader->service_id(), |
| 486 GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, | 486 GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, |
| 487 &max_len); | 487 &max_len); |
| 488 scoped_ptr<char[]> temp(new char[max_len]); | 488 scoped_ptr<char[]> temp(new char[max_len]); |
| 489 GLint len = 0; | 489 GLint len = 0; |
| 490 glGetTranslatedShaderSourceANGLE( | 490 glGetTranslatedShaderSourceANGLE( |
| 491 shader->service_id(), max_len, &len, temp.get()); | 491 shader->service_id(), max_len, &len, temp.get()); |
| 492 DCHECK(max_len == 0 || len < max_len); | 492 DCHECK(max_len == 0 || len < max_len); |
| 493 DCHECK(len == 0 || temp[len] == '\0'); | 493 DCHECK(len == 0 || temp[len] == '\0'); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 515 << "unless the driver is buggy:" | 515 << "unless the driver is buggy:" |
| 516 << "\n--original-shader--\n" << (source ? *source : std::string()) | 516 << "\n--original-shader--\n" << (source ? *source : std::string()) |
| 517 << "\n--translated-shader--\n" << shader_src << "\n--info-log--\n" | 517 << "\n--translated-shader--\n" << shader_src << "\n--info-log--\n" |
| 518 << *shader->log_info(); | 518 << *shader->log_info(); |
| 519 } | 519 } |
| 520 } | 520 } |
| 521 | 521 |
| 522 bool Program::Link(ShaderManager* manager, | 522 bool Program::Link(ShaderManager* manager, |
| 523 ShaderTranslator* vertex_translator, | 523 ShaderTranslator* vertex_translator, |
| 524 ShaderTranslator* fragment_translator, | 524 ShaderTranslator* fragment_translator, |
| 525 FeatureInfo* feature_info, |
| 525 const ShaderCacheCallback& shader_callback) { | 526 const ShaderCacheCallback& shader_callback) { |
| 526 ClearLinkStatus(); | 527 ClearLinkStatus(); |
| 527 if (!CanLink()) { | 528 if (!CanLink()) { |
| 528 set_log_info("missing shaders"); | 529 set_log_info("missing shaders"); |
| 529 return false; | 530 return false; |
| 530 } | 531 } |
| 531 if (DetectAttribLocationBindingConflicts()) { | 532 if (DetectAttribLocationBindingConflicts()) { |
| 532 set_log_info("glBindAttribLocation() conflicts"); | 533 set_log_info("glBindAttribLocation() conflicts"); |
| 533 return false; | 534 return false; |
| 534 } | 535 } |
| (...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1230 manager_->StopTracking(this); | 1231 manager_->StopTracking(this); |
| 1231 manager_ = NULL; | 1232 manager_ = NULL; |
| 1232 } | 1233 } |
| 1233 } | 1234 } |
| 1234 | 1235 |
| 1235 | 1236 |
| 1236 ProgramManager::ProgramManager(ProgramCache* program_cache, | 1237 ProgramManager::ProgramManager(ProgramCache* program_cache, |
| 1237 uint32 max_varying_vectors) | 1238 uint32 max_varying_vectors) |
| 1238 : program_count_(0), | 1239 : program_count_(0), |
| 1239 have_context_(true), | 1240 have_context_(true), |
| 1241 disable_workarounds_( |
| 1242 CommandLine::ForCurrentProcess()->HasSwitch( |
| 1243 switches::kDisableGpuDriverBugWorkarounds)), |
| 1240 program_cache_(program_cache), | 1244 program_cache_(program_cache), |
| 1241 max_varying_vectors_(max_varying_vectors) { } | 1245 max_varying_vectors_(max_varying_vectors) { } |
| 1242 | 1246 |
| 1243 ProgramManager::~ProgramManager() { | 1247 ProgramManager::~ProgramManager() { |
| 1244 DCHECK(programs_.empty()); | 1248 DCHECK(programs_.empty()); |
| 1245 } | 1249 } |
| 1246 | 1250 |
| 1247 void ProgramManager::Destroy(bool have_context) { | 1251 void ProgramManager::Destroy(bool have_context) { |
| 1248 have_context_ = have_context; | 1252 have_context_ = have_context; |
| 1249 programs_.clear(); | 1253 programs_.clear(); |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1324 DCHECK(program); | 1328 DCHECK(program); |
| 1325 DCHECK(IsOwned(program)); | 1329 DCHECK(IsOwned(program)); |
| 1326 program->MarkAsDeleted(); | 1330 program->MarkAsDeleted(); |
| 1327 RemoveProgramInfoIfUnused(shader_manager, program); | 1331 RemoveProgramInfoIfUnused(shader_manager, program); |
| 1328 } | 1332 } |
| 1329 | 1333 |
| 1330 void ProgramManager::UseProgram(Program* program) { | 1334 void ProgramManager::UseProgram(Program* program) { |
| 1331 DCHECK(program); | 1335 DCHECK(program); |
| 1332 DCHECK(IsOwned(program)); | 1336 DCHECK(IsOwned(program)); |
| 1333 program->IncUseCount(); | 1337 program->IncUseCount(); |
| 1338 ClearUniforms(program); |
| 1334 } | 1339 } |
| 1335 | 1340 |
| 1336 void ProgramManager::UnuseProgram( | 1341 void ProgramManager::UnuseProgram( |
| 1337 ShaderManager* shader_manager, | 1342 ShaderManager* shader_manager, |
| 1338 Program* program) { | 1343 Program* program) { |
| 1339 DCHECK(shader_manager); | 1344 DCHECK(shader_manager); |
| 1340 DCHECK(program); | 1345 DCHECK(program); |
| 1341 DCHECK(IsOwned(program)); | 1346 DCHECK(IsOwned(program)); |
| 1342 program->DecUseCount(); | 1347 program->DecUseCount(); |
| 1343 RemoveProgramInfoIfUnused(shader_manager, program); | 1348 RemoveProgramInfoIfUnused(shader_manager, program); |
| 1344 } | 1349 } |
| 1345 | 1350 |
| 1346 void ProgramManager::ClearUniforms(Program* program) { | 1351 void ProgramManager::ClearUniforms(Program* program) { |
| 1347 DCHECK(program); | 1352 DCHECK(program); |
| 1348 program->ClearUniforms(&zero_); | 1353 if (!disable_workarounds_) { |
| 1354 program->ClearUniforms(&zero_); |
| 1355 } |
| 1349 } | 1356 } |
| 1350 | 1357 |
| 1351 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { | 1358 int32 ProgramManager::MakeFakeLocation(int32 index, int32 element) { |
| 1352 return index + element * 0x10000; | 1359 return index + element * 0x10000; |
| 1353 } | 1360 } |
| 1354 | 1361 |
| 1355 } // namespace gles2 | 1362 } // namespace gles2 |
| 1356 } // namespace gpu | 1363 } // namespace gpu |
| OLD | NEW |