Chromium Code Reviews| Index: gpu/command_buffer/service/program_cache.cc |
| diff --git a/gpu/command_buffer/service/program_cache.cc b/gpu/command_buffer/service/program_cache.cc |
| index b219086c046c95e1c37d1315f8706a80daacfdd0..b8b6cada800997624bbfe9db195662cacfb357e8 100644 |
| --- a/gpu/command_buffer/service/program_cache.cc |
| +++ b/gpu/command_buffer/service/program_cache.cc |
| @@ -22,7 +22,9 @@ void ProgramCache::Clear() { |
| ProgramCache::LinkedProgramStatus ProgramCache::GetLinkedProgramStatus( |
| const std::string& shader_signature_a, |
| const std::string& shader_signature_b, |
| - const std::map<std::string, GLint>* bind_attrib_location_map) const { |
| + const std::map<std::string, GLint>* bind_attrib_location_map, |
| + const std::vector<std::string>* transform_feedback_varyings, |
| + GLenum transform_feedback_buffer_mode) const { |
| char a_sha[kHashLength]; |
| char b_sha[kHashLength]; |
| ComputeShaderHash(shader_signature_a, a_sha); |
| @@ -32,6 +34,8 @@ ProgramCache::LinkedProgramStatus ProgramCache::GetLinkedProgramStatus( |
| ComputeProgramHash(a_sha, |
| b_sha, |
| bind_attrib_location_map, |
| + transform_feedback_varyings, |
| + transform_feedback_buffer_mode, |
| sha); |
| const std::string sha_string(sha, kHashLength); |
| @@ -46,7 +50,9 @@ ProgramCache::LinkedProgramStatus ProgramCache::GetLinkedProgramStatus( |
| void ProgramCache::LinkedProgramCacheSuccess( |
| const std::string& shader_signature_a, |
| const std::string& shader_signature_b, |
| - const LocationMap* bind_attrib_location_map) { |
| + const LocationMap* bind_attrib_location_map, |
| + const std::vector<std::string>* transform_feedback_varyings, |
| + GLenum transform_feedback_buffer_mode) { |
| char a_sha[kHashLength]; |
| char b_sha[kHashLength]; |
| ComputeShaderHash(shader_signature_a, a_sha); |
| @@ -55,6 +61,8 @@ void ProgramCache::LinkedProgramCacheSuccess( |
| ComputeProgramHash(a_sha, |
| b_sha, |
| bind_attrib_location_map, |
| + transform_feedback_varyings, |
| + transform_feedback_buffer_mode, |
| sha); |
| const std::string sha_string(sha, kHashLength); |
| @@ -81,33 +89,46 @@ size_t CalculateMapSize(const std::map<std::string, GLint>* map) { |
| if (!map) { |
| return 0; |
| } |
| - std::map<std::string, GLint>::const_iterator it; |
| size_t total = 0; |
| - for (it = map->begin(); it != map->end(); ++it) { |
| + for (auto it = map->begin(); it != map->end(); ++it) { |
| total += 4 + it->first.length(); |
| } |
| return total; |
| } |
| + |
| +size_t CalculateVaryingsSize(const std::vector<std::string>* varyings) { |
| + if (!varyings) { |
|
piman
2015/03/13 18:32:10
It's never NULL in production. Remove (and fix tes
|
| + return 0; |
| + } |
| + size_t total = 0; |
| + for (auto it = varyings->begin(); it != varyings->end(); ++it) { |
|
piman
2015/03/13 18:32:10
nit: you can use range loops:
for (auto& varying :
|
| + total += 1 + it->length(); |
| + } |
| + return total; |
| +} |
| } // anonymous namespace |
| void ProgramCache::ComputeProgramHash( |
| const char* hashed_shader_0, |
| const char* hashed_shader_1, |
| const std::map<std::string, GLint>* bind_attrib_location_map, |
| + const std::vector<std::string>* transform_feedback_varyings, |
| + GLenum transform_feedback_buffer_mode, |
| char* result) const { |
| const size_t shader0_size = kHashLength; |
| const size_t shader1_size = kHashLength; |
| const size_t map_size = CalculateMapSize(bind_attrib_location_map); |
| - const size_t total_size = shader0_size + shader1_size + map_size; |
| + const size_t var_size = CalculateVaryingsSize(transform_feedback_varyings); |
| + const size_t total_size = shader0_size + shader1_size + map_size + var_size |
| + + sizeof(transform_feedback_buffer_mode); |
| scoped_ptr<unsigned char[]> buffer(new unsigned char[total_size]); |
| memcpy(buffer.get(), hashed_shader_0, shader0_size); |
| memcpy(&buffer[shader0_size], hashed_shader_1, shader1_size); |
| + size_t current_pos = shader0_size + shader1_size; |
| if (map_size != 0) { |
| // copy our map |
| - size_t current_pos = shader0_size + shader1_size; |
| - std::map<std::string, GLint>::const_iterator it; |
| - for (it = bind_attrib_location_map->begin(); |
| + for (auto it = bind_attrib_location_map->begin(); |
| it != bind_attrib_location_map->end(); |
| ++it) { |
| const size_t name_size = it->first.length(); |
| @@ -120,6 +141,20 @@ void ProgramCache::ComputeProgramHash( |
| buffer[current_pos++] = static_cast<unsigned char>(value); |
| } |
| } |
| + |
| + if (var_size != 0) { |
| + // copy transform feedback varyings |
| + for (auto it = transform_feedback_varyings->begin(); |
| + it != transform_feedback_varyings->end(); |
| + ++it) { |
|
piman
2015/03/13 18:32:10
nit: same here, range loops would help readability
|
| + const size_t name_size = it->length(); |
|
Zhenyao Mo
2015/03/13 18:01:42
you could just set name_size to it->length() + 1,
|
| + memcpy(&buffer.get()[current_pos], it->c_str(), name_size); |
| + current_pos += name_size; |
| + buffer[current_pos++] = ' '; |
| + } |
| + } |
| + memcpy(&buffer[current_pos], &transform_feedback_buffer_mode, |
| + sizeof(transform_feedback_buffer_mode)); |
| base::SHA1HashBytes(buffer.get(), |
| total_size, reinterpret_cast<unsigned char*>(result)); |
| } |