| 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/memory_program_cache.h" | 5 #include "gpu/command_buffer/service/memory_program_cache.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/sha1.h" | 10 #include "base/sha1.h" |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 void MemoryProgramCache::ClearBackend() { | 167 void MemoryProgramCache::ClearBackend() { |
| 168 store_.Clear(); | 168 store_.Clear(); |
| 169 DCHECK_EQ(0U, curr_size_bytes_); | 169 DCHECK_EQ(0U, curr_size_bytes_); |
| 170 } | 170 } |
| 171 | 171 |
| 172 ProgramCache::ProgramLoadResult MemoryProgramCache::LoadLinkedProgram( | 172 ProgramCache::ProgramLoadResult MemoryProgramCache::LoadLinkedProgram( |
| 173 GLuint program, | 173 GLuint program, |
| 174 Shader* shader_a, | 174 Shader* shader_a, |
| 175 Shader* shader_b, | 175 Shader* shader_b, |
| 176 const LocationMap* bind_attrib_location_map, | 176 const LocationMap* bind_attrib_location_map, |
| 177 const std::vector<std::string>& transform_feedback_varyings, |
| 178 GLenum transform_feedback_buffer_mode, |
| 177 const ShaderCacheCallback& shader_callback) { | 179 const ShaderCacheCallback& shader_callback) { |
| 178 char a_sha[kHashLength]; | 180 char a_sha[kHashLength]; |
| 179 char b_sha[kHashLength]; | 181 char b_sha[kHashLength]; |
| 180 DCHECK(shader_a && !shader_a->last_compiled_source().empty() && | 182 DCHECK(shader_a && !shader_a->last_compiled_source().empty() && |
| 181 shader_b && !shader_b->last_compiled_source().empty()); | 183 shader_b && !shader_b->last_compiled_source().empty()); |
| 182 ComputeShaderHash( | 184 ComputeShaderHash( |
| 183 shader_a->last_compiled_signature(), a_sha); | 185 shader_a->last_compiled_signature(), a_sha); |
| 184 ComputeShaderHash( | 186 ComputeShaderHash( |
| 185 shader_b->last_compiled_signature(), b_sha); | 187 shader_b->last_compiled_signature(), b_sha); |
| 186 | 188 |
| 187 char sha[kHashLength]; | 189 char sha[kHashLength]; |
| 188 ComputeProgramHash(a_sha, | 190 ComputeProgramHash(a_sha, |
| 189 b_sha, | 191 b_sha, |
| 190 bind_attrib_location_map, | 192 bind_attrib_location_map, |
| 193 transform_feedback_varyings, |
| 194 transform_feedback_buffer_mode, |
| 191 sha); | 195 sha); |
| 192 const std::string sha_string(sha, kHashLength); | 196 const std::string sha_string(sha, kHashLength); |
| 193 | 197 |
| 194 ProgramMRUCache::iterator found = store_.Get(sha_string); | 198 ProgramMRUCache::iterator found = store_.Get(sha_string); |
| 195 if (found == store_.end()) { | 199 if (found == store_.end()) { |
| 196 return PROGRAM_LOAD_FAILURE; | 200 return PROGRAM_LOAD_FAILURE; |
| 197 } | 201 } |
| 198 const scoped_refptr<ProgramCacheValue> value = found->second; | 202 const scoped_refptr<ProgramCacheValue> value = found->second; |
| 199 glProgramBinary(program, | 203 glProgramBinary(program, |
| 200 value->format(), | 204 value->format(), |
| (...skipping 26 matching lines...) Expand all Loading... |
| 227 } | 231 } |
| 228 | 232 |
| 229 return PROGRAM_LOAD_SUCCESS; | 233 return PROGRAM_LOAD_SUCCESS; |
| 230 } | 234 } |
| 231 | 235 |
| 232 void MemoryProgramCache::SaveLinkedProgram( | 236 void MemoryProgramCache::SaveLinkedProgram( |
| 233 GLuint program, | 237 GLuint program, |
| 234 const Shader* shader_a, | 238 const Shader* shader_a, |
| 235 const Shader* shader_b, | 239 const Shader* shader_b, |
| 236 const LocationMap* bind_attrib_location_map, | 240 const LocationMap* bind_attrib_location_map, |
| 241 const std::vector<std::string>& transform_feedback_varyings, |
| 242 GLenum transform_feedback_buffer_mode, |
| 237 const ShaderCacheCallback& shader_callback) { | 243 const ShaderCacheCallback& shader_callback) { |
| 238 GLenum format; | 244 GLenum format; |
| 239 GLsizei length = 0; | 245 GLsizei length = 0; |
| 240 glGetProgramiv(program, GL_PROGRAM_BINARY_LENGTH_OES, &length); | 246 glGetProgramiv(program, GL_PROGRAM_BINARY_LENGTH_OES, &length); |
| 241 if (length == 0 || static_cast<unsigned int>(length) > max_size_bytes_) { | 247 if (length == 0 || static_cast<unsigned int>(length) > max_size_bytes_) { |
| 242 return; | 248 return; |
| 243 } | 249 } |
| 244 scoped_ptr<char[]> binary(new char[length]); | 250 scoped_ptr<char[]> binary(new char[length]); |
| 245 glGetProgramBinary(program, | 251 glGetProgramBinary(program, |
| 246 length, | 252 length, |
| 247 NULL, | 253 NULL, |
| 248 &format, | 254 &format, |
| 249 binary.get()); | 255 binary.get()); |
| 250 UMA_HISTOGRAM_COUNTS("GPU.ProgramCache.ProgramBinarySizeBytes", length); | 256 UMA_HISTOGRAM_COUNTS("GPU.ProgramCache.ProgramBinarySizeBytes", length); |
| 251 | 257 |
| 252 char a_sha[kHashLength]; | 258 char a_sha[kHashLength]; |
| 253 char b_sha[kHashLength]; | 259 char b_sha[kHashLength]; |
| 254 DCHECK(shader_a && !shader_a->last_compiled_source().empty() && | 260 DCHECK(shader_a && !shader_a->last_compiled_source().empty() && |
| 255 shader_b && !shader_b->last_compiled_source().empty()); | 261 shader_b && !shader_b->last_compiled_source().empty()); |
| 256 ComputeShaderHash( | 262 ComputeShaderHash( |
| 257 shader_a->last_compiled_signature(), a_sha); | 263 shader_a->last_compiled_signature(), a_sha); |
| 258 ComputeShaderHash( | 264 ComputeShaderHash( |
| 259 shader_b->last_compiled_signature(), b_sha); | 265 shader_b->last_compiled_signature(), b_sha); |
| 260 | 266 |
| 261 char sha[kHashLength]; | 267 char sha[kHashLength]; |
| 262 ComputeProgramHash(a_sha, | 268 ComputeProgramHash(a_sha, |
| 263 b_sha, | 269 b_sha, |
| 264 bind_attrib_location_map, | 270 bind_attrib_location_map, |
| 271 transform_feedback_varyings, |
| 272 transform_feedback_buffer_mode, |
| 265 sha); | 273 sha); |
| 266 const std::string sha_string(sha, sizeof(sha)); | 274 const std::string sha_string(sha, sizeof(sha)); |
| 267 | 275 |
| 268 UMA_HISTOGRAM_COUNTS("GPU.ProgramCache.MemorySizeBeforeKb", | 276 UMA_HISTOGRAM_COUNTS("GPU.ProgramCache.MemorySizeBeforeKb", |
| 269 curr_size_bytes_ / 1024); | 277 curr_size_bytes_ / 1024); |
| 270 | 278 |
| 271 // Evict any cached program with the same key in favor of the least recently | 279 // Evict any cached program with the same key in favor of the least recently |
| 272 // accessed. | 280 // accessed. |
| 273 ProgramMRUCache::iterator existing = store_.Peek(sha_string); | 281 ProgramMRUCache::iterator existing = store_.Peek(sha_string); |
| 274 if(existing != store_.end()) | 282 if(existing != store_.end()) |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 program_cache_->LinkedProgramCacheSuccess(program_hash); | 411 program_cache_->LinkedProgramCacheSuccess(program_hash); |
| 404 } | 412 } |
| 405 | 413 |
| 406 MemoryProgramCache::ProgramCacheValue::~ProgramCacheValue() { | 414 MemoryProgramCache::ProgramCacheValue::~ProgramCacheValue() { |
| 407 program_cache_->curr_size_bytes_ -= length_; | 415 program_cache_->curr_size_bytes_ -= length_; |
| 408 program_cache_->Evict(program_hash_); | 416 program_cache_->Evict(program_hash_); |
| 409 } | 417 } |
| 410 | 418 |
| 411 } // namespace gles2 | 419 } // namespace gles2 |
| 412 } // namespace gpu | 420 } // namespace gpu |
| OLD | NEW |