| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/base64.h" | 9 #include "base/base64.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 shader_a->set_attrib_map(value->attrib_map_0()); | 207 shader_a->set_attrib_map(value->attrib_map_0()); |
| 208 shader_a->set_uniform_map(value->uniform_map_0()); | 208 shader_a->set_uniform_map(value->uniform_map_0()); |
| 209 shader_a->set_varying_map(value->varying_map_0()); | 209 shader_a->set_varying_map(value->varying_map_0()); |
| 210 shader_a->set_output_variable_list(value->output_variable_list_0()); | 210 shader_a->set_output_variable_list(value->output_variable_list_0()); |
| 211 shader_b->set_attrib_map(value->attrib_map_1()); | 211 shader_b->set_attrib_map(value->attrib_map_1()); |
| 212 shader_b->set_uniform_map(value->uniform_map_1()); | 212 shader_b->set_uniform_map(value->uniform_map_1()); |
| 213 shader_b->set_varying_map(value->varying_map_1()); | 213 shader_b->set_varying_map(value->varying_map_1()); |
| 214 shader_b->set_output_variable_list(value->output_variable_list_1()); | 214 shader_b->set_output_variable_list(value->output_variable_list_1()); |
| 215 | 215 |
| 216 if (!shader_callback.is_null() && !disable_gpu_shader_disk_cache_) { | 216 if (!shader_callback.is_null() && !disable_gpu_shader_disk_cache_) { |
| 217 scoped_ptr<GpuProgramProto> proto( | 217 std::unique_ptr<GpuProgramProto> proto( |
| 218 GpuProgramProto::default_instance().New()); | 218 GpuProgramProto::default_instance().New()); |
| 219 proto->set_sha(sha, kHashLength); | 219 proto->set_sha(sha, kHashLength); |
| 220 proto->set_format(value->format()); | 220 proto->set_format(value->format()); |
| 221 proto->set_program(value->data(), value->length()); | 221 proto->set_program(value->data(), value->length()); |
| 222 | 222 |
| 223 FillShaderProto(proto->mutable_vertex_shader(), a_sha, shader_a); | 223 FillShaderProto(proto->mutable_vertex_shader(), a_sha, shader_a); |
| 224 FillShaderProto(proto->mutable_fragment_shader(), b_sha, shader_b); | 224 FillShaderProto(proto->mutable_fragment_shader(), b_sha, shader_b); |
| 225 RunShaderCallback(shader_callback, proto.get(), sha_string); | 225 RunShaderCallback(shader_callback, proto.get(), sha_string); |
| 226 } | 226 } |
| 227 | 227 |
| 228 return PROGRAM_LOAD_SUCCESS; | 228 return PROGRAM_LOAD_SUCCESS; |
| 229 } | 229 } |
| 230 | 230 |
| 231 void MemoryProgramCache::SaveLinkedProgram( | 231 void MemoryProgramCache::SaveLinkedProgram( |
| 232 GLuint program, | 232 GLuint program, |
| 233 const Shader* shader_a, | 233 const Shader* shader_a, |
| 234 const Shader* shader_b, | 234 const Shader* shader_b, |
| 235 const LocationMap* bind_attrib_location_map, | 235 const LocationMap* bind_attrib_location_map, |
| 236 const std::vector<std::string>& transform_feedback_varyings, | 236 const std::vector<std::string>& transform_feedback_varyings, |
| 237 GLenum transform_feedback_buffer_mode, | 237 GLenum transform_feedback_buffer_mode, |
| 238 const ShaderCacheCallback& shader_callback) { | 238 const ShaderCacheCallback& shader_callback) { |
| 239 GLenum format; | 239 GLenum format; |
| 240 GLsizei length = 0; | 240 GLsizei length = 0; |
| 241 glGetProgramiv(program, GL_PROGRAM_BINARY_LENGTH_OES, &length); | 241 glGetProgramiv(program, GL_PROGRAM_BINARY_LENGTH_OES, &length); |
| 242 if (length == 0 || static_cast<unsigned int>(length) > max_size_bytes_) { | 242 if (length == 0 || static_cast<unsigned int>(length) > max_size_bytes_) { |
| 243 return; | 243 return; |
| 244 } | 244 } |
| 245 scoped_ptr<char[]> binary(new char[length]); | 245 std::unique_ptr<char[]> binary(new char[length]); |
| 246 glGetProgramBinary(program, | 246 glGetProgramBinary(program, |
| 247 length, | 247 length, |
| 248 NULL, | 248 NULL, |
| 249 &format, | 249 &format, |
| 250 binary.get()); | 250 binary.get()); |
| 251 UMA_HISTOGRAM_COUNTS("GPU.ProgramCache.ProgramBinarySizeBytes", length); | 251 UMA_HISTOGRAM_COUNTS("GPU.ProgramCache.ProgramBinarySizeBytes", length); |
| 252 | 252 |
| 253 char a_sha[kHashLength]; | 253 char a_sha[kHashLength]; |
| 254 char b_sha[kHashLength]; | 254 char b_sha[kHashLength]; |
| 255 DCHECK(shader_a && !shader_a->last_compiled_source().empty() && | 255 DCHECK(shader_a && !shader_a->last_compiled_source().empty() && |
| (...skipping 20 matching lines...) Expand all Loading... |
| 276 ProgramMRUCache::iterator existing = store_.Peek(sha_string); | 276 ProgramMRUCache::iterator existing = store_.Peek(sha_string); |
| 277 if(existing != store_.end()) | 277 if(existing != store_.end()) |
| 278 store_.Erase(existing); | 278 store_.Erase(existing); |
| 279 | 279 |
| 280 while (curr_size_bytes_ + length > max_size_bytes_) { | 280 while (curr_size_bytes_ + length > max_size_bytes_) { |
| 281 DCHECK(!store_.empty()); | 281 DCHECK(!store_.empty()); |
| 282 store_.Erase(store_.rbegin()); | 282 store_.Erase(store_.rbegin()); |
| 283 } | 283 } |
| 284 | 284 |
| 285 if (!shader_callback.is_null() && !disable_gpu_shader_disk_cache_) { | 285 if (!shader_callback.is_null() && !disable_gpu_shader_disk_cache_) { |
| 286 scoped_ptr<GpuProgramProto> proto( | 286 std::unique_ptr<GpuProgramProto> proto( |
| 287 GpuProgramProto::default_instance().New()); | 287 GpuProgramProto::default_instance().New()); |
| 288 proto->set_sha(sha, kHashLength); | 288 proto->set_sha(sha, kHashLength); |
| 289 proto->set_format(format); | 289 proto->set_format(format); |
| 290 proto->set_program(binary.get(), length); | 290 proto->set_program(binary.get(), length); |
| 291 | 291 |
| 292 FillShaderProto(proto->mutable_vertex_shader(), a_sha, shader_a); | 292 FillShaderProto(proto->mutable_vertex_shader(), a_sha, shader_a); |
| 293 FillShaderProto(proto->mutable_fragment_shader(), b_sha, shader_b); | 293 FillShaderProto(proto->mutable_fragment_shader(), b_sha, shader_b); |
| 294 RunShaderCallback(shader_callback, proto.get(), sha_string); | 294 RunShaderCallback(shader_callback, proto.get(), sha_string); |
| 295 } | 295 } |
| 296 | 296 |
| 297 store_.Put( | 297 store_.Put( |
| 298 sha_string, | 298 sha_string, |
| 299 new ProgramCacheValue( | 299 new ProgramCacheValue( |
| 300 length, format, binary.release(), sha_string, a_sha, | 300 length, format, binary.release(), sha_string, a_sha, |
| 301 shader_a->attrib_map(), shader_a->uniform_map(), | 301 shader_a->attrib_map(), shader_a->uniform_map(), |
| 302 shader_a->varying_map(), shader_a->output_variable_list(), b_sha, | 302 shader_a->varying_map(), shader_a->output_variable_list(), b_sha, |
| 303 shader_b->attrib_map(), shader_b->uniform_map(), | 303 shader_b->attrib_map(), shader_b->uniform_map(), |
| 304 shader_b->varying_map(), shader_b->output_variable_list(), this)); | 304 shader_b->varying_map(), shader_b->output_variable_list(), this)); |
| 305 | 305 |
| 306 UMA_HISTOGRAM_COUNTS("GPU.ProgramCache.MemorySizeAfterKb", | 306 UMA_HISTOGRAM_COUNTS("GPU.ProgramCache.MemorySizeAfterKb", |
| 307 curr_size_bytes_ / 1024); | 307 curr_size_bytes_ / 1024); |
| 308 } | 308 } |
| 309 | 309 |
| 310 void MemoryProgramCache::LoadProgram(const std::string& program) { | 310 void MemoryProgramCache::LoadProgram(const std::string& program) { |
| 311 scoped_ptr<GpuProgramProto> proto(GpuProgramProto::default_instance().New()); | 311 std::unique_ptr<GpuProgramProto> proto( |
| 312 GpuProgramProto::default_instance().New()); |
| 312 if (proto->ParseFromString(program)) { | 313 if (proto->ParseFromString(program)) { |
| 313 AttributeMap vertex_attribs; | 314 AttributeMap vertex_attribs; |
| 314 UniformMap vertex_uniforms; | 315 UniformMap vertex_uniforms; |
| 315 VaryingMap vertex_varyings; | 316 VaryingMap vertex_varyings; |
| 316 OutputVariableList vertex_output_variables; | 317 OutputVariableList vertex_output_variables; |
| 317 for (int i = 0; i < proto->vertex_shader().attribs_size(); i++) { | 318 for (int i = 0; i < proto->vertex_shader().attribs_size(); i++) { |
| 318 RetrieveShaderAttributeInfo(proto->vertex_shader().attribs(i), | 319 RetrieveShaderAttributeInfo(proto->vertex_shader().attribs(i), |
| 319 &vertex_attribs); | 320 &vertex_attribs); |
| 320 } | 321 } |
| 321 for (int i = 0; i < proto->vertex_shader().uniforms_size(); i++) { | 322 for (int i = 0; i < proto->vertex_shader().uniforms_size(); i++) { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 346 for (int i = 0; i < proto->fragment_shader().varyings_size(); i++) { | 347 for (int i = 0; i < proto->fragment_shader().varyings_size(); i++) { |
| 347 RetrieveShaderVaryingInfo(proto->fragment_shader().varyings(i), | 348 RetrieveShaderVaryingInfo(proto->fragment_shader().varyings(i), |
| 348 &fragment_varyings); | 349 &fragment_varyings); |
| 349 } | 350 } |
| 350 for (int i = 0; i < proto->fragment_shader().output_variables_size(); i++) { | 351 for (int i = 0; i < proto->fragment_shader().output_variables_size(); i++) { |
| 351 RetrieveShaderOutputVariableInfo( | 352 RetrieveShaderOutputVariableInfo( |
| 352 proto->fragment_shader().output_variables(i), | 353 proto->fragment_shader().output_variables(i), |
| 353 &fragment_output_variables); | 354 &fragment_output_variables); |
| 354 } | 355 } |
| 355 | 356 |
| 356 scoped_ptr<char[]> binary(new char[proto->program().length()]); | 357 std::unique_ptr<char[]> binary(new char[proto->program().length()]); |
| 357 memcpy(binary.get(), proto->program().c_str(), proto->program().length()); | 358 memcpy(binary.get(), proto->program().c_str(), proto->program().length()); |
| 358 | 359 |
| 359 store_.Put( | 360 store_.Put( |
| 360 proto->sha(), | 361 proto->sha(), |
| 361 new ProgramCacheValue( | 362 new ProgramCacheValue( |
| 362 proto->program().length(), proto->format(), binary.release(), | 363 proto->program().length(), proto->format(), binary.release(), |
| 363 proto->sha(), proto->vertex_shader().sha().c_str(), vertex_attribs, | 364 proto->sha(), proto->vertex_shader().sha().c_str(), vertex_attribs, |
| 364 vertex_uniforms, vertex_varyings, vertex_output_variables, | 365 vertex_uniforms, vertex_varyings, vertex_output_variables, |
| 365 proto->fragment_shader().sha().c_str(), fragment_attribs, | 366 proto->fragment_shader().sha().c_str(), fragment_attribs, |
| 366 fragment_uniforms, fragment_varyings, fragment_output_variables, | 367 fragment_uniforms, fragment_varyings, fragment_output_variables, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 program_cache_->LinkedProgramCacheSuccess(program_hash); | 409 program_cache_->LinkedProgramCacheSuccess(program_hash); |
| 409 } | 410 } |
| 410 | 411 |
| 411 MemoryProgramCache::ProgramCacheValue::~ProgramCacheValue() { | 412 MemoryProgramCache::ProgramCacheValue::~ProgramCacheValue() { |
| 412 program_cache_->curr_size_bytes_ -= length_; | 413 program_cache_->curr_size_bytes_ -= length_; |
| 413 program_cache_->Evict(program_hash_); | 414 program_cache_->Evict(program_hash_); |
| 414 } | 415 } |
| 415 | 416 |
| 416 } // namespace gles2 | 417 } // namespace gles2 |
| 417 } // namespace gpu | 418 } // namespace gpu |
| OLD | NEW |