memory_program_cache_unittest.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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)#include "gpu/command_buffer/service/memory_program_cache.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/gl_utils.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/shader_manager.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/shader_translator.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_bindings.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::ElementsAreArray; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Invoke; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgPointee; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArrayArgument; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef gpu::gles2::ShaderTranslator::VariableMap VariableMap; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // anonymous namespace 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProgramBinaryEmulator { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator(GLsizei length, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum format, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* binary) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : length_(length), 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) format_(format), 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) binary_(binary) { } 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetProgramBinary(GLuint program, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLsizei buffer_size, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLsizei* length, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum* format, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLvoid* binary) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *length = length_; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *format = format_; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(binary, binary_, length_); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProgramBinary(GLuint program, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum format, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLvoid* binary, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLsizei length) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // format and length are verified by matcher 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(binary_, binary, length)); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLsizei length() const { return length_; } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum format() const { return format_; } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* binary() const { return binary_; } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLsizei length_; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum format_; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* binary_; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MemoryProgramCacheTest : public testing::Test { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t kCacheSizeBytes = 1024; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kVertexShaderClientId = 90; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kVertexShaderServiceId = 100; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kFragmentShaderClientId = 91; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kFragmentShaderServiceId = 100; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MemoryProgramCacheTest() 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : cache_(new MemoryProgramCache(kCacheSizeBytes)), 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_(NULL), 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_(NULL), 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shader_cache_count_(0) { } 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~MemoryProgramCacheTest() { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shader_manager_.Destroy(false); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ShaderCacheCb(const std::string& key, const std::string& shader) { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shader_cache_count_++; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shader_cache_shader_ = shader; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 shader_cache_count() { return shader_cache_count_; } 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& shader_cache_shader() { return shader_cache_shader_; } 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.reset(new ::testing::StrictMock<gfx::MockGLInterface>()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::gfx::GLInterface::SetGLInterface(gl_.get()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_shader_ = shader_manager_.CreateShader(kVertexShaderClientId, 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kVertexShaderServiceId, 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GL_VERTEX_SHADER); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_ = shader_manager_.CreateShader( 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFragmentShaderClientId, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFragmentShaderServiceId, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FRAGMENT_SHADER); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(vertex_shader_ != NULL); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(fragment_shader_ != NULL); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef ShaderTranslatorInterface::VariableInfo VariableInfo; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef ShaderTranslator::VariableMap VariableMap; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap vertex_attrib_map; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap vertex_uniform_map; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap fragment_attrib_map; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap fragment_uniform_map; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_attrib_map["a"] = VariableInfo(1, 34, "a"); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_uniform_map["a"] = VariableInfo(0, 10, "a"); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_uniform_map["b"] = VariableInfo(2, 3114, "b"); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_attrib_map["jjjbb"] = VariableInfo(463, 1114, "jjjbb"); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_uniform_map["k"] = VariableInfo(10, 34413, "k"); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->set_attrib_map(vertex_attrib_map); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->set_uniform_map(vertex_uniform_map); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->set_attrib_map(vertex_attrib_map); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->set_uniform_map(vertex_uniform_map); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->UpdateSource("bbbalsldkdkdkd"); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->UpdateSource("bbbal sldkdkdkas 134 ad"); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->FlagSourceAsCompiled(true); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->FlagSourceAsCompiled(true); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->SetStatus(true, NULL, NULL); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->SetStatus(true, NULL, NULL); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::gfx::GLInterface::SetGLInterface(NULL); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.reset(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetExpectationsForSaveLinkedProgram( 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint program_id, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator* emulator) const { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProgramiv(program_id, GL_PROGRAM_BINARY_LENGTH_OES, _)) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgPointee<2>(emulator->length())); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProgramBinary(program_id, emulator->length(), _, _, _)) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(emulator, &ProgramBinaryEmulator::GetProgramBinary)); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetExpectationsForLoadLinkedProgram( 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint program_id, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator* emulator) const { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinary(program_id, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emulator->format(), 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emulator->length())) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(emulator, &ProgramBinaryEmulator::ProgramBinary)); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProgramiv(program_id, GL_LINK_STATUS, _)) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgPointee<2>(GL_TRUE)); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetExpectationsForLoadLinkedProgramFailure( 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint program_id, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator* emulator) const { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinary(program_id, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emulator->format(), 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emulator->length())) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(emulator, &ProgramBinaryEmulator::ProgramBinary)); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProgramiv(program_id, GL_LINK_STATUS, _)) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgPointee<2>(GL_FALSE)); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use StrictMock to make 100% sure we know how GL will be called. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr< ::testing::StrictMock<gfx::MockGLInterface> > gl_; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MemoryProgramCache> cache_; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShaderManager shader_manager_; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shader* vertex_shader_; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shader* fragment_shader_; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 shader_cache_count_; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string shader_cache_shader_; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, CacheSave) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *vertex_shader_->deferred_compilation_source(), 20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *fragment_shader_->deferred_compilation_source(), 20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadProgram) { 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GLenum kFormat = 1; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kProgramId = 10; 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kBinaryLength = 20; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char test_binary[kBinaryLength]; 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_binary[i] = i; 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 22590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *vertex_shader_->deferred_compilation_source(), 23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *fragment_shader_->deferred_compilation_source(), 23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->Clear(); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->LoadProgram(shader_cache_shader()); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *vertex_shader_->deferred_compilation_source(), 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *fragment_shader_->deferred_compilation_source(), 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, CacheLoadMatchesSave) { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap vertex_attrib_map = vertex_shader_->attrib_map(); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap vertex_uniform_map = vertex_shader_->uniform_map(); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap fragment_attrib_map = fragment_shader_->attrib_map(); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap fragment_uniform_map = fragment_shader_->uniform_map(); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_shader_->set_attrib_map(VariableMap()); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_shader_->set_uniform_map(VariableMap()); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_->set_attrib_map(VariableMap()); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_->set_uniform_map(VariableMap()); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kProgramId, 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_shader_, 28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_, 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // apparently the hash_map implementation on android doesn't have the 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // equality operator 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_ANDROID) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(vertex_attrib_map, vertex_shader_->uniform_map()); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(vertex_attrib_map, fragment_shader_->attrib_map()); 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(vertex_attrib_map, fragment_shader_->uniform_map()); 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadProgramMatchesSave) { 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GLenum kFormat = 1; 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kProgramId = 10; 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kBinaryLength = 20; 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char test_binary[kBinaryLength]; 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_binary[i] = i; 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap vertex_attrib_map = vertex_shader_->attrib_map(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap vertex_uniform_map = vertex_shader_->uniform_map(); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap fragment_attrib_map = fragment_shader_->attrib_map(); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap fragment_uniform_map = fragment_shader_->uniform_map(); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->set_attrib_map(VariableMap()); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->set_uniform_map(VariableMap()); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->set_attrib_map(VariableMap()); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->set_uniform_map(VariableMap()); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->Clear(); 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->LoadProgram(shader_cache_shader()); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // apparently the hash_map implementation on android doesn't have the 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // equality operator 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(vertex_attrib_map, vertex_shader_->uniform_map()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(vertex_attrib_map, fragment_shader_->attrib_map()); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(vertex_attrib_map, fragment_shader_->uniform_map()); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadFailOnLinkFalse) { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgramFailure(kProgramId, &emulator); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 36990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 37290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentSource) { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 38890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 38990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string vertex_orig_source = 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *vertex_shader_->deferred_compilation_source(); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->UpdateSource("different!"); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->FlagSourceAsCompiled(true); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 40090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 40390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->UpdateSource(vertex_orig_source.c_str()); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->FlagSourceAsCompiled(true); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->UpdateSource("different!"); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->FlagSourceAsCompiled(true); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 41790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentMap) { 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramCache::LocationMap binding_map; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) binding_map["test"] = 512; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 43790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 43990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &binding_map, 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) binding_map["different!"] = 59; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 44890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 45090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &binding_map, 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 45790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 46090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, MemoryProgramCacheEviction) { 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef ShaderTranslator::VariableMap VariableMap; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); 47890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 47990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kEvictingProgramId = 11; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kEvictingBinaryLength = kCacheSizeBytes - kBinaryLength + 1; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // save old source and modify for new program 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string old_source = 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *fragment_shader_->deferred_compilation_source(); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->UpdateSource("al sdfkjdk"); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->FlagSourceAsCompiled(true); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]> bigTestBinary = 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]>(new char[kEvictingBinaryLength]); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kEvictingBinaryLength; ++i) { 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bigTestBinary[i] = i % 250; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator2(kEvictingBinaryLength, 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFormat, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bigTestBinary.get()); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kEvictingProgramId, &emulator2); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->SaveLinkedProgram(kEvictingProgramId, 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 50490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, 50790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *vertex_shader_->deferred_compilation_source(), 51390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *fragment_shader_->deferred_compilation_source(), 51590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_UNKNOWN, cache_->GetLinkedProgramStatus( 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_source, 51990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *fragment_shader_->deferred_compilation_source(), 52190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, SaveCorrectProgram) { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->UpdateSource("different!"); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); 53790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 53890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *vertex_shader_->deferred_compilation_source(), 54490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *fragment_shader_->deferred_compilation_source(), 54690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadCorrectProgram) { 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 56190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 56290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *vertex_shader_->deferred_compilation_source(), 56890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *fragment_shader_->deferred_compilation_source(), 57090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->UpdateSource("different!"); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 57990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 58290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, OverwriteOnNewSave) { 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 59890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 59990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary2[kBinaryLength]; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary2[i] = (i*2) % 250; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator2(kBinaryLength, kFormat, test_binary2); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator2); 61090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 61190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator2); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 61990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 62290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 629