Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(429)

Unified Diff: gpu/command_buffer/service/program_cache.cc

Issue 1013463003: Update from https://crrev.com/320931 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/service/program_cache.h ('k') | gpu/command_buffer/service/program_cache_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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));
}
« no previous file with comments | « gpu/command_buffer/service/program_cache.h ('k') | gpu/command_buffer/service/program_cache_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698