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" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "gpu/command_buffer/service/gpu_service_test.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/shader_manager.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/shader_translator.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "gpu/command_buffer/service/test_helper.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_bindings.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::ElementsAreArray; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Invoke; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgPointee; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArrayArgument; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef gpu::gles2::ShaderTranslator::VariableMap VariableMap; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // anonymous namespace 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProgramBinaryEmulator { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator(GLsizei length, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum format, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* binary) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : length_(length), 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) format_(format), 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) binary_(binary) { } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetProgramBinary(GLuint program, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLsizei buffer_size, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLsizei* length, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum* format, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLvoid* binary) { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *length = length_; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *format = format_; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(binary, binary_, length_); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ProgramBinary(GLuint program, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum format, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLvoid* binary, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLsizei length) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // format and length are verified by matcher 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(binary_, binary, length)); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLsizei length() const { return length_; } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum format() const { return format_; } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* binary() const { return binary_; } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLsizei length_; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLenum format_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* binary_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class MemoryProgramCacheTest : public GpuServiceTest { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t kCacheSizeBytes = 1024; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kVertexShaderClientId = 90; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kVertexShaderServiceId = 100; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kFragmentShaderClientId = 91; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const GLuint kFragmentShaderServiceId = 100; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MemoryProgramCacheTest() 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : cache_(new MemoryProgramCache(kCacheSizeBytes)), 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_(NULL), 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_(NULL), 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shader_cache_count_(0) { } 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~MemoryProgramCacheTest() { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shader_manager_.Destroy(false); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ShaderCacheCb(const std::string& key, const std::string& shader) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shader_cache_count_++; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shader_cache_shader_ = shader; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 shader_cache_count() { return shader_cache_count_; } 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& shader_cache_shader() { return shader_cache_shader_; } 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GpuServiceTest::SetUp(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_shader_ = shader_manager_.CreateShader(kVertexShaderClientId, 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kVertexShaderServiceId, 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GL_VERTEX_SHADER); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_ = shader_manager_.CreateShader( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFragmentShaderClientId, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFragmentShaderServiceId, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FRAGMENT_SHADER); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(vertex_shader_ != NULL); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(fragment_shader_ != NULL); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef ShaderTranslatorInterface::VariableInfo VariableInfo; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef ShaderTranslator::VariableMap VariableMap; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap vertex_attrib_map; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap vertex_uniform_map; 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) VariableMap vertex_varying_map; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap fragment_attrib_map; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap fragment_uniform_map; 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) VariableMap fragment_varying_map; 1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) vertex_attrib_map["a"] = VariableInfo(1, 34, SH_PRECISION_LOWP, 0, "a"); 118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) vertex_uniform_map["a"] = VariableInfo(0, 10, SH_PRECISION_MEDIUMP, 1, "a"); 119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) vertex_uniform_map["b"] = VariableInfo(2, 3114, SH_PRECISION_HIGHP, 1, "b"); 120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) vertex_varying_map["c"] = VariableInfo(3, 2, SH_PRECISION_HIGHP, 1, "c"); 1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) fragment_attrib_map["jjjbb"] = 122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) VariableInfo(463, 1114, SH_PRECISION_MEDIUMP, 0, "jjjbb"); 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) fragment_uniform_map["k"] = 124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) VariableInfo(10, 34413, SH_PRECISION_MEDIUMP, 1, "k"); 125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) fragment_varying_map["c"] = VariableInfo(3, 2, SH_PRECISION_HIGHP, 1, "c"); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci vertex_shader_->set_source("bbbalsldkdkdkd"); 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fragment_shader_->set_source("bbbal sldkdkdkas 134 ad"); 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestHelper::SetShaderStates( 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gl_.get(), vertex_shader_, true, NULL, NULL, 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &vertex_attrib_map, &vertex_uniform_map, &vertex_varying_map, 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NULL); 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestHelper::SetShaderStates( 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gl_.get(), fragment_shader_, true, NULL, NULL, 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &fragment_attrib_map, &fragment_uniform_map, &fragment_varying_map, 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NULL); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetExpectationsForSaveLinkedProgram( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint program_id, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator* emulator) const { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProgramiv(program_id, GL_PROGRAM_BINARY_LENGTH_OES, _)) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgPointee<2>(emulator->length())); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProgramBinary(program_id, emulator->length(), _, _, _)) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(emulator, &ProgramBinaryEmulator::GetProgramBinary)); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetExpectationsForLoadLinkedProgram( 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint program_id, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator* emulator) const { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinary(program_id, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emulator->format(), 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emulator->length())) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(emulator, &ProgramBinaryEmulator::ProgramBinary)); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProgramiv(program_id, GL_LINK_STATUS, _)) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgPointee<2>(GL_TRUE)); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetExpectationsForLoadLinkedProgramFailure( 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLint program_id, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator* emulator) const { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinary(program_id, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emulator->format(), 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) emulator->length())) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(Invoke(emulator, &ProgramBinaryEmulator::ProgramBinary)); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*gl_.get(), 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProgramiv(program_id, GL_LINK_STATUS, _)) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(SetArgPointee<2>(GL_FALSE)); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MemoryProgramCache> cache_; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ShaderManager shader_manager_; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shader* vertex_shader_; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Shader* fragment_shader_; 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32 shader_cache_count_; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string shader_cache_shader_; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, CacheSave) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, 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( 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci vertex_shader_->signature_source(), 20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fragment_shader_->signature_source(), 20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadProgram) { 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GLenum kFormat = 1; 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kProgramId = 10; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kBinaryLength = 20; 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char test_binary[kBinaryLength]; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_binary[i] = i; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci vertex_shader_->signature_source(), 23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fragment_shader_->signature_source(), 23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->Clear(); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->LoadProgram(shader_cache_shader()); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci vertex_shader_->signature_source(), 24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fragment_shader_->signature_source(), 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL)); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, CacheLoadMatchesSave) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap vertex_attrib_map = vertex_shader_->attrib_map(); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap vertex_uniform_map = vertex_shader_->uniform_map(); 2663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) VariableMap vertex_varying_map = vertex_shader_->varying_map(); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap fragment_attrib_map = fragment_shader_->attrib_map(); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VariableMap fragment_uniform_map = fragment_shader_->uniform_map(); 2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) VariableMap fragment_varying_map = fragment_shader_->varying_map(); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_shader_->set_attrib_map(VariableMap()); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_shader_->set_uniform_map(VariableMap()); 2733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) vertex_shader_->set_varying_map(VariableMap()); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_->set_attrib_map(VariableMap()); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_->set_uniform_map(VariableMap()); 2763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) fragment_shader_->set_varying_map(VariableMap()); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kProgramId, 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vertex_shader_, 28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fragment_shader_, 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // apparently the hash_map implementation on android doesn't have the 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // equality operator 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_ANDROID) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); 2943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(vertex_uniform_map, vertex_shader_->uniform_map()); 2953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(vertex_varying_map, vertex_shader_->varying_map()); 2963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(fragment_attrib_map, fragment_shader_->attrib_map()); 2973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(fragment_uniform_map, fragment_shader_->uniform_map()); 2983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(fragment_varying_map, fragment_shader_->varying_map()); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadProgramMatchesSave) { 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GLenum kFormat = 1; 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kProgramId = 10; 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int kBinaryLength = 20; 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char test_binary[kBinaryLength]; 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_binary[i] = i; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, shader_cache_count()); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap vertex_attrib_map = vertex_shader_->attrib_map(); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap vertex_uniform_map = vertex_shader_->uniform_map(); 3213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) VariableMap vertex_varying_map = vertex_shader_->varying_map(); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap fragment_attrib_map = fragment_shader_->attrib_map(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VariableMap fragment_uniform_map = fragment_shader_->uniform_map(); 3243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) VariableMap fragment_varying_map = fragment_shader_->varying_map(); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->set_attrib_map(VariableMap()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_->set_uniform_map(VariableMap()); 3283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) vertex_shader_->set_varying_map(VariableMap()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->set_attrib_map(VariableMap()); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_->set_uniform_map(VariableMap()); 3313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) fragment_shader_->set_varying_map(VariableMap()); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->Clear(); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_->LoadProgram(shader_cache_shader()); 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // apparently the hash_map implementation on android doesn't have the 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // equality operator 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_ANDROID) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(vertex_attrib_map, vertex_shader_->attrib_map()); 3523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(vertex_uniform_map, vertex_shader_->uniform_map()); 3533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(vertex_varying_map, vertex_shader_->varying_map()); 3543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(fragment_attrib_map, fragment_shader_->attrib_map()); 3553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(fragment_uniform_map, fragment_shader_->uniform_map()); 3563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(fragment_varying_map, fragment_shader_->varying_map()); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadFailOnLinkFalse) { 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 37190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 37290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgramFailure(kProgramId, &emulator); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 38090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 38390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentSource) { 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 39990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 40090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string vertex_orig_source = vertex_shader_->signature_source(); 4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci vertex_shader_->set_source("different!"); 4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 41090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 41390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci vertex_shader_->set_source(vertex_orig_source); 4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestHelper::SetShaderStates(gl_.get(), vertex_shader_, true); 4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fragment_shader_->set_source("different!"); 4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 42490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 42790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentMap) { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramCache::LocationMap binding_map; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) binding_map["test"] = 512; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 44790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 44990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &binding_map, 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) binding_map["different!"] = 59; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 45890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 46090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &binding_map, 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_FAILURE, cache_->LoadLinkedProgram( 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 46790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 47090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, MemoryProgramCacheEviction) { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); 48790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 48890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kEvictingProgramId = 11; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLuint kEvictingBinaryLength = kCacheSizeBytes - kBinaryLength + 1; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // save old source and modify for new program 4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& old_source = fragment_shader_->signature_source(); 4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fragment_shader_->set_source("al sdfkjdk"); 4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TestHelper::SetShaderStates(gl_.get(), fragment_shader_, true); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]> bigTestBinary = 501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]>(new char[kEvictingBinaryLength]); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kEvictingBinaryLength; ++i) { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bigTestBinary[i] = i % 250; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator2(kEvictingBinaryLength, 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFormat, 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bigTestBinary.get()); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kEvictingProgramId, &emulator2); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cache_->SaveLinkedProgram(kEvictingProgramId, 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 51290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL, 51590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci vertex_shader_->signature_source(), 52190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fragment_shader_->signature_source(), 52390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_UNKNOWN, cache_->GetLinkedProgramStatus( 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_source, 52790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fragment_shader_->signature_source(), 52990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, SaveCorrectProgram) { 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator1(kBinaryLength, kFormat, test_binary); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci vertex_shader_->set_source("different!"); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator1); 54590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 54690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci vertex_shader_->signature_source(), 55290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fragment_shader_->signature_source(), 55490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, LoadCorrectProgram) { 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 56990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 57090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::LINK_SUCCEEDED, cache_->GetLinkedProgramStatus( 5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci vertex_shader_->signature_source(), 57690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fragment_shader_->signature_source(), 57890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci fragment_shader_->set_source("different!"); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 58790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 59090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MemoryProgramCacheTest, OverwriteOnNewSave) { 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GLenum kFormat = 1; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kProgramId = 10; 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kBinaryLength = 20; 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary[kBinaryLength]; 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary[i] = i; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator(kBinaryLength, kFormat, test_binary); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator); 60690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 60790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char test_binary2[kBinaryLength]; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < kBinaryLength; ++i) { 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_binary2[i] = (i*2) % 250; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProgramBinaryEmulator emulator2(kBinaryLength, kFormat, test_binary2); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForSaveLinkedProgram(kProgramId, &emulator2); 61890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cache_->SaveLinkedProgram(kProgramId, vertex_shader_, NULL, 61990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fragment_shader_, NULL, NULL, 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetExpectationsForLoadLinkedProgram(kProgramId, &emulator2); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ProgramCache::PROGRAM_LOAD_SUCCESS, cache_->LoadLinkedProgram( 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kProgramId, 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vertex_shader_, 62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fragment_shader_, 629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 63090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NULL, 631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&MemoryProgramCacheTest::ShaderCacheCb, 632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)))); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gles2 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 637