memory_program_cache_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kVertexShaderServiceId, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (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); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *vertex_shader_->deferred_compilation_source(), 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *fragment_shader_->deferred_compilation_source(), 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadProgram) { 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GLenum kFormat = 1; 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kProgramId = 10; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kBinaryLength = 20; 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char test_binary[kBinaryLength]; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_binary[i] = i; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *vertex_shader_->deferred_compilation_source(), 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *fragment_shader_->deferred_compilation_source(), 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->Clear(); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->LoadProgram(shader_cache_shader()); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *vertex_shader_->deferred_compilation_source(), 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *fragment_shader_->deferred_compilation_source(), 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, CacheLoadMatchesSave) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap vertex_attrib_map = vertex_shader_->attrib_map(); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap vertex_uniform_map = vertex_shader_->uniform_map(); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap fragment_attrib_map = fragment_shader_->attrib_map(); 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap fragment_uniform_map = fragment_shader_->uniform_map(); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_shader_->set_attrib_map(VariableMap()); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_shader_->set_uniform_map(VariableMap()); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_->set_attrib_map(VariableMap()); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_->set_uniform_map(VariableMap()); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kProgramId, 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_shader_, 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_, 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // apparently the hash_map implementation on android doesn't have the 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // equality operator 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_ANDROID) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(vertex_attrib_map, vertex_shader_->uniform_map()); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(vertex_attrib_map, fragment_shader_->attrib_map()); 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(vertex_attrib_map, fragment_shader_->uniform_map()); 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadProgramMatchesSave) { 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GLenum kFormat = 1; 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kProgramId = 10; 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kBinaryLength = 20; 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char test_binary[kBinaryLength]; 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_binary[i] = i; 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap vertex_attrib_map = vertex_shader_->attrib_map(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap vertex_uniform_map = vertex_shader_->uniform_map(); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap fragment_attrib_map = fragment_shader_->attrib_map(); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap fragment_uniform_map = fragment_shader_->uniform_map(); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->set_attrib_map(VariableMap()); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->set_uniform_map(VariableMap()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->set_attrib_map(VariableMap()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->set_uniform_map(VariableMap()); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->Clear(); 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->LoadProgram(shader_cache_shader()); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // apparently the hash_map implementation on android doesn't have the 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // equality operator 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(vertex_attrib_map, vertex_shader_->uniform_map()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(vertex_attrib_map, fragment_shader_->attrib_map()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(vertex_attrib_map, fragment_shader_->uniform_map()); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadFailOnLinkFalse) { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgramFailure(kProgramId, &emulator); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentSource) { 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string vertex_orig_source = 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *vertex_shader_->deferred_compilation_source(); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->UpdateSource("different!"); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->FlagSourceAsCompiled(true); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->UpdateSource(vertex_orig_source.c_str()); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->FlagSourceAsCompiled(true); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->UpdateSource("different!"); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->FlagSourceAsCompiled(true); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentMap) { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramCache::LocationMap binding_map; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) binding_map["test"] = 512; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &binding_map, 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) binding_map["different!"] = 59; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &binding_map)); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, MemoryProgramCacheEviction) { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef ShaderTranslator::VariableMap VariableMap; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kEvictingProgramId = 11; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kEvictingBinaryLength = kCacheSizeBytes - kBinaryLength + 1; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // save old source and modify for new program 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string old_source = 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *fragment_shader_->deferred_compilation_source(); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->UpdateSource("al sdfkjdk"); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->FlagSourceAsCompiled(true); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_array<char> bigTestBinary = 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_array<char>(new char[kEvictingBinaryLength]); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kEvictingBinaryLength; ++i) { 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bigTestBinary[i] = i % 250; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator2(kEvictingBinaryLength, 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFormat, 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bigTestBinary.get()); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kEvictingProgramId, &emulator2); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->SaveLinkedProgram(kEvictingProgramId, 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *vertex_shader_->deferred_compilation_source(), 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *fragment_shader_->deferred_compilation_source(), 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_UNKNOWN, cache_->GetLinkedProgramStatus( 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_source, 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *fragment_shader_->deferred_compilation_source(), 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, SaveCorrectProgram) { 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->UpdateSource("different!"); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *vertex_shader_->deferred_compilation_source(), 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *fragment_shader_->deferred_compilation_source(), 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadCorrectProgram) { 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *vertex_shader_->deferred_compilation_source(), 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *fragment_shader_->deferred_compilation_source(), 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->UpdateSource("different!"); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, OverwriteOnNewSave) { 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary2[kBinaryLength]; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary2[i] = (i*2) % 250; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator2(kBinaryLength, kFormat, test_binary2); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator2); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, fragment_shader_, NULL, 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator2); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 564