15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GPU_COMMAND_BUFFER_SERVICE_PROGRAM_CACHE_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_PROGRAM_CACHE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sha1.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_decoder.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/shader_manager.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Shader; 2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ShaderTranslator; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Program cache base class for caching linked gpu programs 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GPU_EXPORT ProgramCache { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t kHashLength = base::kSHA1Length; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<std::string, GLint> LocationMap; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum LinkedProgramStatus { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LINK_UNKNOWN, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LINK_SUCCEEDED 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum ProgramLoadResult { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROGRAM_LOAD_FAILURE, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROGRAM_LOAD_SUCCESS 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramCache(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ProgramCache(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LinkedProgramStatus GetLinkedProgramStatus( 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string& untranslated_shader_a, 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ShaderTranslatorInterface* translator_a, 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string& untranslated_shader_b, 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ShaderTranslatorInterface* translator_b, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationMap* bind_attrib_location_map) const; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads the linked program from the cache. If the program is not found or 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there was an error, PROGRAM_LOAD_FAILURE should be returned. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ProgramLoadResult LoadLinkedProgram( 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint program, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shader* shader_a, 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ShaderTranslatorInterface* translator_a, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shader* shader_b, 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ShaderTranslatorInterface* translator_b, 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const LocationMap* bind_attrib_location_map, 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const ShaderCacheCallback& shader_callback) = 0; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Saves the program into the cache. If successful, the implementation should 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // call LinkedProgramCacheSuccess. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SaveLinkedProgram( 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint program, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Shader* shader_a, 6690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ShaderTranslatorInterface* translator_a, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Shader* shader_b, 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ShaderTranslatorInterface* translator_b, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LocationMap* bind_attrib_location_map, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ShaderCacheCallback& shader_callback) = 0; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void LoadProgram(const std::string& program) = 0; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // clears the cache 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Clear(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only for testing 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LinkedProgramCacheSuccess(const std::string& shader_a, 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ShaderTranslatorInterface* translator_a, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& shader_b, 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ShaderTranslatorInterface* translator_b, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationMap* bind_attrib_location_map); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called by implementing class after a shader was successfully cached 86bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch void LinkedProgramCacheSuccess(const std::string& program_hash); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // result is not null terminated 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ComputeShaderHash(const std::string& shader, 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ShaderTranslatorInterface* translator, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* result) const; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // result is not null terminated. hashed shaders are expected to be 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // kHashLength in length 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ComputeProgramHash( 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* hashed_shader_0, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* hashed_shader_1, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LocationMap* bind_attrib_location_map, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* result) const; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 101bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch void Evict(const std::string& program_hash); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::hash_map<std::string, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LinkedProgramStatus> LinkStatusMap; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called to clear the backend cache 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ClearBackend() = 0; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LinkStatusMap link_status_; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ProgramCache); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // GPU_COMMAND_BUFFER_SERVICE_PROGRAM_CACHE_H_ 119