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) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->SetStatus(true, NULL, NULL); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->SetStatus(true, NULL, NULL); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::gfx::GLInterface::SetGLInterface(NULL); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gl_.reset(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetExpectationsForSaveLinkedProgram( 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint program_id, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator* emulator) const { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProgramiv(program_id, GL_PROGRAM_BINARY_LENGTH_OES, _)) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgPointee<2>(emulator->length())); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProgramBinary(program_id, emulator->length(), _, _, _)) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(emulator, &ProgramBinaryEmulator::GetProgramBinary)); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetExpectationsForLoadLinkedProgram( 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint program_id, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator* emulator) const { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinary(program_id, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emulator->format(), 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emulator->length())) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(emulator, &ProgramBinaryEmulator::ProgramBinary)); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProgramiv(program_id, GL_LINK_STATUS, _)) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgPointee<2>(GL_TRUE)); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetExpectationsForLoadLinkedProgramFailure( 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint program_id, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator* emulator) const { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinary(program_id, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emulator->format(), 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emulator->length())) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(emulator, &ProgramBinaryEmulator::ProgramBinary)); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProgramiv(program_id, GL_LINK_STATUS, _)) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgPointee<2>(GL_FALSE)); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use StrictMock to make 100% sure we know how GL will be called. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr< ::testing::StrictMock<gfx::MockGLInterface> > gl_; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MemoryProgramCache> cache_; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShaderManager shader_manager_; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shader* vertex_shader_; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shader* fragment_shader_; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 shader_cache_count_; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string shader_cache_shader_; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, CacheSave) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 203bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *vertex_shader_->signature_source(), 20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 205bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *fragment_shader_->signature_source(), 20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadProgram) { 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GLenum kFormat = 1; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kProgramId = 10; 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kBinaryLength = 20; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char test_binary[kBinaryLength]; 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_binary[i] = i; 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 228bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *vertex_shader_->signature_source(), 22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 230bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *fragment_shader_->signature_source(), 23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->Clear(); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->LoadProgram(shader_cache_shader()); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 239bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *vertex_shader_->signature_source(), 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 241bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *fragment_shader_->signature_source(), 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, CacheLoadMatchesSave) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap vertex_attrib_map = vertex_shader_->attrib_map(); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap vertex_uniform_map = vertex_shader_->uniform_map(); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap fragment_attrib_map = fragment_shader_->attrib_map(); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap fragment_uniform_map = fragment_shader_->uniform_map(); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_shader_->set_attrib_map(VariableMap()); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_shader_->set_uniform_map(VariableMap()); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_->set_attrib_map(VariableMap()); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_->set_uniform_map(VariableMap()); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kProgramId, 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_shader_, 27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_, 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // apparently the hash_map implementation on android doesn't have the 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // equality operator 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_ANDROID) 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(vertex_attrib_map, vertex_shader_->uniform_map()); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(vertex_attrib_map, fragment_shader_->attrib_map()); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(vertex_attrib_map, fragment_shader_->uniform_map()); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadProgramMatchesSave) { 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GLenum kFormat = 1; 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kProgramId = 10; 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kBinaryLength = 20; 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char test_binary[kBinaryLength]; 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_binary[i] = i; 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap vertex_attrib_map = vertex_shader_->attrib_map(); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap vertex_uniform_map = vertex_shader_->uniform_map(); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap fragment_attrib_map = fragment_shader_->attrib_map(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap fragment_uniform_map = fragment_shader_->uniform_map(); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->set_attrib_map(VariableMap()); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->set_uniform_map(VariableMap()); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->set_attrib_map(VariableMap()); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->set_uniform_map(VariableMap()); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->Clear(); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->LoadProgram(shader_cache_shader()); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // apparently the hash_map implementation on android doesn't have the 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // equality operator 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(vertex_attrib_map, vertex_shader_->uniform_map()); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(vertex_attrib_map, fragment_shader_->attrib_map()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(vertex_attrib_map, fragment_shader_->uniform_map()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadFailOnLinkFalse) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 35890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgramFailure(kProgramId, &emulator); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 36790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 37090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentSource) { 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 38690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string vertex_orig_source = 392bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *vertex_shader_->signature_source(); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->UpdateSource("different!"); 394bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch vertex_shader_->SetStatus(true, NULL, NULL); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 39890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 40190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->UpdateSource(vertex_orig_source.c_str()); 406bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch vertex_shader_->SetStatus(true, NULL, NULL); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->UpdateSource("different!"); 408bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch fragment_shader_->SetStatus(true, NULL, NULL); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentMap) { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramCache::LocationMap binding_map; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) binding_map["test"] = 512; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 43590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 43790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &binding_map, 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) binding_map["different!"] = 59; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 44690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 44890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &binding_map, 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 45590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 45890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, MemoryProgramCacheEviction) { 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef ShaderTranslator::VariableMap VariableMap; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); 47690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 47790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kEvictingProgramId = 11; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kEvictingBinaryLength = kCacheSizeBytes - kBinaryLength + 1; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // save old source and modify for new program 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string old_source = 486bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *fragment_shader_->signature_source(); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->UpdateSource("al sdfkjdk"); 488bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch fragment_shader_->SetStatus(true, NULL, NULL); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]> bigTestBinary = 491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]>(new char[kEvictingBinaryLength]); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kEvictingBinaryLength; ++i) { 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bigTestBinary[i] = i % 250; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator2(kEvictingBinaryLength, 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFormat, 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bigTestBinary.get()); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kEvictingProgramId, &emulator2); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->SaveLinkedProgram(kEvictingProgramId, 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 50290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, 50590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 510bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *vertex_shader_->signature_source(), 51190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 512bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *fragment_shader_->signature_source(), 51390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_UNKNOWN, cache_->GetLinkedProgramStatus( 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_source, 51790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 518bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *fragment_shader_->signature_source(), 51990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, SaveCorrectProgram) { 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->UpdateSource("different!"); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); 53590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 53690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 541bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *vertex_shader_->signature_source(), 54290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 543bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *fragment_shader_->signature_source(), 54490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadCorrectProgram) { 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 55990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 56090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 565bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *vertex_shader_->signature_source(), 56690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 567bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch *fragment_shader_->signature_source(), 56890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->UpdateSource("different!"); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 57790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 58090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, OverwriteOnNewSave) { 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 59690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 59790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary2[kBinaryLength]; 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary2[i] = (i*2) % 250; 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator2(kBinaryLength, kFormat, test_binary2); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator2); 60890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 60990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator2); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 61790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 62090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 627