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..31802de2e0bb56f978cca3ec99f86a9cf045704a 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,43 @@ 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) { |
+ size_t total = 0; |
+ for (auto& varying : varyings) { |
+ total += 1 + varying.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 +138,18 @@ void ProgramCache::ComputeProgramHash( |
buffer[current_pos++] = static_cast<unsigned char>(value); |
} |
} |
+ |
+ if (var_size != 0) { |
+ // copy transform feedback varyings |
+ for (auto& varying : transform_feedback_varyings) { |
+ const size_t name_size = varying.length(); |
+ memcpy(&buffer.get()[current_pos], varying.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)); |
} |