Chromium Code Reviews| Index: gpu/command_buffer/service/program_cache.h |
| diff --git a/gpu/command_buffer/service/program_cache.h b/gpu/command_buffer/service/program_cache.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..4d1d0c50484bf6c9fc953b8ddcfb78621e0ffbed |
| --- /dev/null |
| +++ b/gpu/command_buffer/service/program_cache.h |
| @@ -0,0 +1,123 @@ |
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#ifndef GPU_COMMAND_BUFFER_SERVICE_PROGRAM_CACHE_H_ |
| +#define GPU_COMMAND_BUFFER_SERVICE_PROGRAM_CACHE_H_ |
| +#pragma once |
| + |
| +#include <map> |
| +#include <string> |
| + |
| +#include "base/hash_tables.h" |
| +#include "base/sha1.h" |
| +#include "gpu/command_buffer/common/gles2_cmd_format.h" |
|
greggman
2012/06/26 23:00:27
Is this needed?
dmurph
2012/07/04 00:01:29
I need the definition of GLuint, should I use a di
|
| +#include "gpu/command_buffer/service/shader_manager.h" |
| +#include "net/disk_cache/hash.h" |
| + |
| +namespace gpu { |
| +namespace gles2 { |
| + |
| +// Program cache base class for caching linked gpu programs |
| +class GPU_EXPORT ProgramCache { |
| + public: |
| + enum CompiledShaderStatus { |
| + COMPILATION_UNKNOWN, |
| + COMPILATION_SUCCEEDED |
| + }; |
| + |
| + enum LinkedProgramStatus { |
| + LINK_UNKNOWN, |
| + LINK_SUCCEEDED |
| + }; |
| + |
| + ProgramCache() {} |
| + virtual ~ProgramCache(); |
| + |
| + CompiledShaderStatus GetShaderCompilationStatus( |
| + const std::string& shader_src) const; |
| + void ShaderCompilationSucceeded(const std::string& shader_src); |
| + |
| + LinkedProgramStatus GetLinkedProgramStatus( |
| + const std::string& untranslated_a, |
| + const std::string& untranslated_b, |
| + const std::map<std::string, GLint>* bind_attrib_location_map) const; |
| + |
| + virtual bool LoadLinkedProgram( |
| + const GLuint program, |
| + ShaderManager::ShaderInfo* shader_a, |
| + ShaderManager::ShaderInfo* shader_b, |
| + const std::map<std::string, GLint>* bind_attrib_location_map) const = 0; |
| + virtual void SaveLinkedProgram( |
| + const GLuint program, |
| + const ShaderManager::ShaderInfo* shader_a, |
| + const ShaderManager::ShaderInfo* shader_b, |
| + const std::map<std::string, GLint>* bind_attrib_location_map) = 0; |
| + // clears the cache |
| + void Clear(); |
| + |
| + protected: |
| + static const size_t kHashLength = base::kSHA1Length; |
| + |
| + // called by implementing class after a shader was successfully cached |
| + void LinkedProgramCacheSuccess(const std::string& program_hash, |
| + const std::string& shader_a_hash, |
| + const std::string& shader_b_hash); |
| + |
| + // result is not null terminated |
| + void ComputeShaderHash(const std::string& shader, |
| + char* result) const; |
| + |
| + // result is not null terminated. hashed shaders are expected to be |
| + // kHashLength in length |
| + void ComputeProgramHash( |
| + const char* hashed_shader_0, |
| + const char* hashed_shader_1, |
| + const std::map<std::string, GLint>* bind_attrib_location_map, |
| + char* result) const; |
| + |
| + void Evict(const std::string& program_hash, |
| + const std::string& shader_0_hash, |
| + const std::string& shader_1_hash); |
| + |
| + protected: |
| + struct FastHash { |
| + const inline uint32 operator()(const std::string& key) const { |
| + return disk_cache::SuperFastHash(key.data(), |
| + static_cast<int>(key.size())); |
| + } |
| + }; |
| + |
| + private: |
| + struct CompiledShaderInfo { |
| + CompiledShaderInfo() : status(COMPILATION_UNKNOWN), ref_count(0) { } |
| + explicit CompiledShaderInfo(CompiledShaderStatus status_) |
| + : status(status_), |
| + ref_count(0) { } |
| + |
| + CompiledShaderStatus status; |
| + size_t ref_count; |
| + }; |
| + |
| + typedef base::hash_map<const std::string, |
| + CompiledShaderInfo, |
| + FastHash> CompileStatusMap; |
| + typedef base::hash_map<const std::string, |
| + LinkedProgramStatus, |
| + FastHash> LinkStatusMap; |
| + |
| + // called to clear the backend cache |
| + virtual void ClearBackend() = 0; |
| + |
| + CompileStatusMap shader_status_; |
| + LinkStatusMap link_status_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ProgramCache); |
| +}; |
| + |
|
greggman
2012/06/26 23:00:27
style: remove extra blank lines
dmurph
2012/07/04 00:01:29
Done.
|
| + |
| + |
| +} // namespace gles2 |
| +} // namespace gpu |
| + |
| +#endif // GPU_COMMAND_BUFFER_SERVICE_PROGRAM_CACHE_H_ |