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/common_decoder.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/cmd_buffer_engine.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(CommonDecoderBucket, Basic) { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommonDecoder::Bucket bucket; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, bucket.size()); 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL == bucket.GetData(0, 0)); 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(CommonDecoderBucket, Size) { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommonDecoder::Bucket bucket; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bucket.SetSize(24); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(24u, bucket.size()); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bucket.SetSize(12); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(12u, bucket.size()); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(CommonDecoderBucket, GetData) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommonDecoder::Bucket bucket; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bucket.SetSize(24); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL != bucket.GetData(0, 0)); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL != bucket.GetData(24, 0)); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL == bucket.GetData(25, 0)); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL != bucket.GetData(0, 24)); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL == bucket.GetData(0, 25)); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bucket.SetSize(23); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL == bucket.GetData(0, 24)); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(CommonDecoderBucket, SetData) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommonDecoder::Bucket bucket; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char data[] = "testing"; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bucket.SetSize(10); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(bucket.SetData(data, 0, sizeof(data))); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(data, bucket.GetData(0, sizeof(data)), sizeof(data))); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(bucket.SetData(data, 2, sizeof(data))); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(data, bucket.GetData(2, sizeof(data)), sizeof(data))); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(bucket.SetData(data, 0, sizeof(data) * 2)); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(bucket.SetData(data, 5, sizeof(data))); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestCommonDecoder : public CommonDecoder { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from AsyncAPIInterface 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const char* GetCommandName(unsigned int command_id) const OVERRIDE { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetCommonCommandName(static_cast<cmd::CommandId>(command_id)); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from AsyncAPIInterface 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual error::Error DoCommand( 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int command, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int arg_count, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const void* cmd_data) OVERRIDE { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return DoCommonCommand(command, arg_count, cmd_data); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommonDecoder::Bucket* GetBucket(uint32 id) const { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CommonDecoder::GetBucket(id); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockCommandBufferEngine : public CommandBufferEngine { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int32 kStartValidShmId = 1; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int32 kValidShmId = 2; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int32 kInvalidShmId = 3; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const size_t kBufferSize = 1024; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int32 kValidOffset = kBufferSize / 2; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int32 kInvalidOffset = kBufferSize; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine() 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : CommandBufferEngine(), 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) token_(), 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_offset_(0) { 84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory()); 85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch shared_memory->CreateAndMapAnonymous(kBufferSize); 86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch buffer_ = MakeBufferFromSharedMemory(shared_memory.Pass(), kBufferSize); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from CommandBufferEngine. 90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual scoped_refptr<gpu::Buffer> GetSharedMemoryBuffer(int32 shm_id) 91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch OVERRIDE { 92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (IsValidSharedMemoryId(shm_id)) 93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return buffer_; 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return NULL; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename T> 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) T GetSharedMemoryAs(uint32 offset) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(offset, kBufferSize); 100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int8* buffer_memory = static_cast<int8*>(buffer_->memory()); 101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return reinterpret_cast<T>(&buffer_memory[offset]); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 GetSharedMemoryOffset(const void* memory) { 105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int8* buffer_memory = static_cast<int8*>(buffer_->memory()); 106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ptrdiff_t offset = static_cast<const int8*>(memory) - &buffer_memory[0]; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(offset, 0); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(static_cast<size_t>(offset), kBufferSize); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<int32>(offset); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from CommandBufferEngine. 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void set_token(int32 token) OVERRIDE { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) token_ = token; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 token() const { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return token_; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from CommandBufferEngine. 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool SetGetBuffer(int32 transfer_buffer_id) OVERRIDE { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from CommandBufferEngine. 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool SetGetOffset(int32 offset) OVERRIDE { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (static_cast<size_t>(offset) < kBufferSize) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_offset_ = offset; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from CommandBufferEngine. 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int32 GetGetOffset() OVERRIDE { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_offset_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsValidSharedMemoryId(int32 shm_id) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shm_id == kValidShmId || shm_id == kStartValidShmId; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<gpu::Buffer> buffer_; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 token_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32 get_offset_; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 MockCommandBufferEngine::kStartValidShmId; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 MockCommandBufferEngine::kValidShmId; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 MockCommandBufferEngine::kInvalidShmId; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t MockCommandBufferEngine::kBufferSize; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 MockCommandBufferEngine::kValidOffset; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 MockCommandBufferEngine::kInvalidOffset; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CommonDecoderTest : public testing::Test { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_.set_engine(&engine_); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename T> 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error::Error ExecuteCmd(const T& cmd) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(T::kArgFlags == cmd::kFixed, Cmd_kArgFlags_not_kFixed); 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return decoder_.DoCommands( 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1, (const void*)&cmd, ComputeNumEntries(sizeof(cmd)), 0); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) template <typename T> 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error::Error ExecuteImmediateCmd(const T& cmd, size_t data_size) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return decoder_.DoCommands( 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1, (const void*)&cmd, ComputeNumEntries(sizeof(cmd) + data_size), 0); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine engine_; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCommonDecoder decoder_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, Initialize) { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, engine_.GetGetOffset()); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(CommonDecoderTest, DoCommonCommandInvalidCommand) { 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(error::kUnknownCommand, decoder_.DoCommand(999999, 0, NULL)); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, HandleNoop) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::Noop cmd; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSkipCount = 5; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kSkipCount); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteImmediateCmd( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd, kSkipCount * kCommandBufferEntrySize)); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSkipCount2 = 1; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kSkipCount2); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteImmediateCmd( 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd, kSkipCount2 * kCommandBufferEntrySize)); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, SetToken) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetToken cmd; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int32 kTokenId = 123; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, engine_.token()); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kTokenId); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kTokenId, engine_.token()); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, SetBucketSize) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize cmd; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kBucketId = 123; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kBucketLength1 = 1234; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kBucketLength2 = 78; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the bucket does not exist. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL == decoder_.GetBucket(kBucketId)); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can create one. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, kBucketLength1); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommonDecoder::Bucket* bucket; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bucket = decoder_.GetBucket(kBucketId); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL != bucket); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kBucketLength1, bucket->size()); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can change it. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, kBucketLength2); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bucket = decoder_.GetBucket(kBucketId); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(NULL != bucket); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kBucketLength2, bucket->size()); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can delete it. 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 0); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bucket = decoder_.GetBucket(kBucketId); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, bucket->size()); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, SetBucketData) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize size_cmd; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketData cmd; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kData[] = "1234567890123456789"; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kBucketId = 123; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kInvalidBucketId = 124; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_cmd.Init(kBucketId, sizeof(kData)); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(size_cmd)); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommonDecoder::Bucket* bucket = decoder_.GetBucket(kBucketId); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the data is not there. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, memcmp(bucket->GetData(0, sizeof(kData)), kData, sizeof(kData))); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can set it. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSomeOffsetInSharedMemory = 50; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* memory = engine_.GetSharedMemoryAs<void*>(kSomeOffsetInSharedMemory); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(memory, kData, sizeof(kData)); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 0, sizeof(kData), 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(bucket->GetData(0, sizeof(kData)), kData, sizeof(kData))); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can set it partially. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kData2[] = "ABCEDFG"; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSomeOffsetInBucket = 5; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(memory, kData2, sizeof(kData2)); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, kSomeOffsetInBucket, sizeof(kData2), 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(bucket->GetData(kSomeOffsetInBucket, sizeof(kData2)), 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kData2, sizeof(kData2))); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* bucket_data = bucket->GetDataAs<const char*>(0, sizeof(kData)); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that nothing was affected outside of updated area. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kData[kSomeOffsetInBucket - 1], 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bucket_data[kSomeOffsetInBucket - 1]); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kData[kSomeOffsetInBucket + sizeof(kData2)], 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bucket_data[kSomeOffsetInBucket + sizeof(kData2)]); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it fails if the bucket_id is invalid 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kInvalidBucketId, kSomeOffsetInBucket, sizeof(kData2), 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it fails if the offset is out of range. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, bucket->size(), 1, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it fails if the size is out of range. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 0, bucket->size() + 1, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, SetBucketDataImmediate) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize size_cmd; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int8 buffer[1024]; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketDataImmediate& cmd = 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *reinterpret_cast<cmd::SetBucketDataImmediate*>(&buffer); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kData[] = "1234567890123456789"; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kBucketId = 123; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kInvalidBucketId = 124; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_cmd.Init(kBucketId, sizeof(kData)); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(size_cmd)); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommonDecoder::Bucket* bucket = decoder_.GetBucket(kBucketId); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the data is not there. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(0, memcmp(bucket->GetData(0, sizeof(kData)), kData, sizeof(kData))); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can set it. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* memory = &buffer[0] + sizeof(cmd); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(memory, kData, sizeof(kData)); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 0, sizeof(kData)); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteImmediateCmd(cmd, sizeof(kData))); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(bucket->GetData(0, sizeof(kData)), kData, sizeof(kData))); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can set it partially. 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kData2[] = "ABCEDFG"; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSomeOffsetInBucket = 5; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(memory, kData2, sizeof(kData2)); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, kSomeOffsetInBucket, sizeof(kData2)); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteImmediateCmd(cmd, sizeof(kData2))); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(bucket->GetData(kSomeOffsetInBucket, sizeof(kData2)), 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kData2, sizeof(kData2))); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* bucket_data = bucket->GetDataAs<const char*>(0, sizeof(kData)); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that nothing was affected outside of updated area. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kData[kSomeOffsetInBucket - 1], 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bucket_data[kSomeOffsetInBucket - 1]); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kData[kSomeOffsetInBucket + sizeof(kData2)], 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bucket_data[kSomeOffsetInBucket + sizeof(kData2)]); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it fails if the bucket_id is invalid 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kInvalidBucketId, kSomeOffsetInBucket, sizeof(kData2)); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteImmediateCmd(cmd, sizeof(kData2))); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it fails if the offset is out of range. 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, bucket->size(), 1); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteImmediateCmd(cmd, sizeof(kData2))); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it fails if the size is out of range. 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 0, bucket->size() + 1); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteImmediateCmd(cmd, sizeof(kData2))); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, GetBucketStart) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize size_cmd; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketData set_cmd; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::GetBucketStart cmd; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kData[] = "1234567890123456789"; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char zero[sizeof(kData)] = { 0, }; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kBucketSize = sizeof(kData); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kBucketId = 123; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kInvalidBucketId = 124; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Put data in the bucket. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_cmd.Init(kBucketId, sizeof(kData)); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(size_cmd)); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSomeOffsetInSharedMemory = 50; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* start = engine_.GetSharedMemoryAs<uint8*>(kSomeOffsetInSharedMemory); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(start, kData, sizeof(kData)); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_cmd.Init(kBucketId, 0, sizeof(kData), 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(set_cmd)); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the size is correct with no data buffer. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32* memory = 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) engine_.GetSharedMemoryAs<uint32*>(kSomeOffsetInSharedMemory); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *memory = 0x0; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kBucketSize, *memory); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that the data is copied with data buffer. 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kDataOffsetInSharedMemory = 54; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* data = engine_.GetSharedMemoryAs<uint8*>(kDataOffsetInSharedMemory); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *memory = 0x0; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(data, 0, sizeof(kData)); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kBucketSize, MockCommandBufferEngine::kValidShmId, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDataOffsetInSharedMemory); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kBucketSize, *memory); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(data, kData, kBucketSize)); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that we can get a piece. 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *memory = 0x0; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(data, 0, sizeof(kData)); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kPieceSize = kBucketSize / 2; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory, 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kPieceSize, MockCommandBufferEngine::kValidShmId, 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDataOffsetInSharedMemory); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kBucketSize, *memory); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(data, kData, kPieceSize)); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(data + kPieceSize, zero, sizeof(kData) - kPieceSize)); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it fails if the result_id is invalid 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kInvalidBucketId, 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory, 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it fails if the data_id is invalid 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, MockCommandBufferEngine::kInvalidShmId, 0); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it fails if the data_size is invalid 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 0, 0); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kBufferSize + 1, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, 0); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it fails if the data_offset is invalid 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory, 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 1); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory, 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kBufferSize, 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, 1); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it fails if the result size is not set to zero 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *memory = 0x1; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory, 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(CommonDecoderTest, GetBucketData) { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketSize size_cmd; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::SetBucketData set_cmd; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd::GetBucketData cmd; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kData[] = "1234567890123456789"; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char zero[sizeof(kData)] = { 0, }; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kBucketId = 123; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kInvalidBucketId = 124; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_cmd.Init(kBucketId, sizeof(kData)); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(size_cmd)); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSomeOffsetInSharedMemory = 50; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint8* memory = engine_.GetSharedMemoryAs<uint8*>(kSomeOffsetInSharedMemory); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(memory, kData, sizeof(kData)); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_cmd.Init(kBucketId, 0, sizeof(kData), 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(set_cmd)); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can get the whole thing. 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(memory, 0, sizeof(kData)); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 0, sizeof(kData), 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(memory, kData, sizeof(kData))); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check we can get a piece. 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kSomeOffsetInBucket = 5; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint32 kLengthOfPiece = 6; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const uint8 kSentinel = 0xff; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(memory, 0, sizeof(kData)); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memory[-1] = kSentinel; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, kSomeOffsetInBucket, kLengthOfPiece, 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(memory, kData + kSomeOffsetInBucket, kLengthOfPiece)); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, memcmp(memory + kLengthOfPiece, zero, 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(kData) - kLengthOfPiece)); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kSentinel, memory[-1]); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it fails if the bucket_id is invalid 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kInvalidBucketId, kSomeOffsetInBucket, sizeof(kData), 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it fails if the offset is invalid 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, sizeof(kData) + 1, 1, 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that it fails if the size is invalid 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmd.Init(kBucketId, 0, sizeof(kData) + 1, 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockCommandBufferEngine::kValidShmId, kSomeOffsetInSharedMemory); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gpu 514